6 Stimmen

In Django, wie geben Sie in eine Instanz eines Modells eine ForeignKey weiter?

Ich schreibe eine Anwendung, die "Jobs" speichert. Sie sind definiert als Schaltfläche, die mit einem "Benutzer" verknüpft ist. Ich verstehe nicht, wie ich die Schaltfläche in das Modell übergeben kann, wenn ich es erstelle. Mein Modell für Job hat ohne eine Schaltfläche funktioniert, aber jetzt, da ich versuche, Benutzer in das System aufzunehmen, kann ich das Formular nicht validieren.

models.py:

from django.db import models
from django import forms
from django.contrib.auth.models import User

class Job(models.Model):
    user = models.ForeignKey(User)
    name = models.CharField(max_length=50, blank=True)
    pub_date = models.DateTimeField('Veröffentlichungsdatum', auto_now_add=True)
    orig_image = models.ImageField('hochgeladenes Bild', upload_to='origImageDB/', blank=True)
    clean_image = models.ImageField('sauberes Bild', upload_to='cleanImageDB/', blank=True)
    fullsize_image = models.ImageField('Bild in Originalgröße', upload_to='fullsizeImageDB/')
    fullsize_clean_image = models.ImageField('Bild in Originalgröße und sauber', upload_to='fullsizeCleanImageDB/')
    regions = models.TextField(blank=True)
    orig_regions = models.TextField(blank=True)

class JobForm(forms.ModelForm):
    class Meta:
        model = Job

In views.py habe ich die Objekte wie folgt erstellt:

if request.method == 'POST':
    form = JobForm(request.POST, request.FILES)
    if form.is_valid():
        #Hier etwas machen

Ich verstehe, dass dadurch die Formulardaten und die hochgeladenen Dateien an das Formular übergeben werden. Ich verstehe jedoch nicht, wie ich einen Benutzer übergeben kann, um als Fremdschlüssel festgelegt zu werden.

Vielen Dank im Voraus an alle, die helfen können.

7voto

Alasdair Punkte 275312

Ein typisches Muster in Django ist:

  1. Den Benutzer-Feld aus dem Modellformular ausschließen
  2. Das Formular mit commit=False speichern
  3. job.user setzen
  4. In der Datenbank speichern

In deinem Fall:

class JobForm(forms.ModelForm):
    class Meta:
        model = Job
        exclude = ('user',)

if request.method == 'POST':
    form = JobForm(request.POST, request.FILES)
    job = form.save(commit=False)
    job.user = request.user
    job.save()
    # Die nächste Zeile ist hier nicht notwendig, da wir keine m2m-Felder haben
    form.save_m2m()

Siehe die Django-Dokumentation zum Methoden save() des Modellformulars für weitere Informationen.

0 Stimmen

Habe nicht bemerkt, dass die save() Funktion von ModelForm eine Instanz der im Meta-Attribut des Formulars angegebenen Modellklasse zurückgibt. Danke dafür!

1voto

Chris Pratt Punkte 219403

Versuchen Sie:

if request.method == 'POST':
    data = request.POST
    data['user'] = request.user
    form = JobForm(data, request.FILES)
    if form.is_valid():
        #Hier etwas tun

0 Stimmen

Dies funktioniert gut, außer dass "request.user" durch "request.user.id" ersetzt werden sollte. Danke.

0 Stimmen

@user1216674 Tatsächlich funktioniert request.user in Django 1.6.1 gut.

1 Stimmen

Request.POST ist unveränderlich

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X