2012-02-17 65 views
6

我正在写一个存储“作业”的应用程序。它们被定义为具有链接到“用户”的ForeignKey。我不明白如何在创建它时将ForeignKey传递到模型中。 My Model for Job在没有ForeignKey的情况下工作得很好,但现在我试图将用户添加到系统中,我无法获取表单进行验证。在Django中,你如何将一个ForeignKey传递给模型的一个实例?

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('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。

在此先感谢任何可以帮助的人。

回答

1

尝试:

if request.method == 'POST': 
    data = request.POST 
    data['user'] = request.user 
    form = JobForm(data, request.FILES) 
    if form.is_valid(): 
     #Do something here 
+0

这工作正常,除了'request.user'应该是'request.user.id'。谢谢。 – user1216674 2012-02-17 18:02:00

+0

@ user1216674其实在Django 1.6.1中request.user工作正常 – AndrewSmiley 2014-02-18 17:33:06

+1

request.POST是不可变的 – mossplix 2014-04-07 11:46:04

7

在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() 

见关于model form save() method Django文档以获取更多信息。

+0

没有意识到ModelForm的save()函数返回了在表单的Meta类模型属性中指定的模型类的一个实例。感谢你! – AndrewSmiley 2014-02-18 17:32:06

相关问题