Как в Django передать ForeignKey экземпляру модели?

Я пишу приложение, в котором хранятся «Работа». Они определяются как имеющие внешний ключ, связанный с «пользователем». Я не понимаю, как передать ForeignKey в модель при ее создании. Моя модель для работы отлично работала без ForeignKey, но теперь, когда я пытаюсь добавить пользователей в систему, я не могу проверить форму.

модели.ру:

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('date published', auto_now_add=True)
    orig_image = models.ImageField('uploaded image', upload_to='origImageDB/', blank=True)
    clean_image = models.ImageField('clean image', upload_to='cleanImageDB/', blank=True)
    fullsize_image = models.ImageField('fullsize image', upload_to='fullsizeImageDB/')
    fullsize_clean_image = models.ImageField('fullsize clean image', upload_to='fullsizeCleanImageDB/')
    regions = models.TextField(blank=True)
    orig_regions = models.TextField(blank=True)

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

В views.py я создавал объекты следующим образом:

if request.method == 'POST':
    form = JobForm(request.POST, request.FILES)
    if form.is_valid():
        #Do something here

Я понимаю, что это передает данные формы и загруженные файлы в форму. Однако я не понимаю, как передать пользователя, который будет установлен как ForeignKey.

Заранее спасибо всем, кто может помочь.


person user1216674    schedule 17.02.2012    source источник


Ответы (2)


Типичный шаблон в Django:

  1. исключить поле user из формы модели
  2. сохраните форму с помощью commit=False
  3. установить job.user
  4. сохранить в базу данных

В твоем случае:

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()
    # the next line isn't necessary here, because we don't have any m2m fields
    form.save_m2m()

См. документацию Django по методу формы модели save()< /a> для получения дополнительной информации.

person Alasdair    schedule 17.02.2012
comment
Не понял, что функция save() ModelForm возвращает экземпляр класса модели, указанного в атрибуте модели класса Meta формы. Спасибо за это! - person AndrewSmiley; 18.02.2014

Пытаться:

if request.method == 'POST':
    data = request.POST
    data['user'] = request.user
    form = JobForm(data, request.FILES)
    if form.is_valid():
        #Do something here
person Chris Pratt    schedule 17.02.2012
comment
Это отлично работает, за исключением того, что «request.user» должен быть «request.user.id». Спасибо. - person user1216674; 17.02.2012
comment
@user1216674 user1216674 На самом деле в Django 1.6.1 request.user работает нормально - person AndrewSmiley; 18.02.2014
comment
request.POST неизменен - person mossplix; 07.04.2014