【问题标题】:In Django, how do you pass a ForeignKey into an instance of a Model?在 Django 中,如何将 ForeignKey 传递给 Model 的实例?
【发布时间】:2012-03-09 01:50:12
【问题描述】:

我正在编写一个存储“工作”的应用程序。它们被定义为具有链接到“用户”的 ForeignKey。我不明白在创建模型时如何将 ForeignKey 传递给模型。在没有 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 的用户。

提前感谢任何可以提供帮助的人。

【问题讨论】:

    标签: django django-models django-forms django-users


    【解决方案1】:

    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 文档。

    【讨论】:

    • 没有意识到 ModelForm save() 函数返回了在表单的 Meta 类模型属性中指定的模型类的实例。谢谢!
    【解决方案2】:

    试试:

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

    【讨论】:

    • 这工作正常,除了“request.user”应该是“request.user.id”。谢谢。
    • @user1216674 实际上在 Django 1.6.1 request.user 工作正常
    • request.POST 是不可变的
    猜你喜欢
    • 1970-01-01
    • 2016-04-27
    • 2012-01-15
    • 2012-07-24
    • 2011-08-21
    • 2014-03-20
    • 2015-03-05
    • 2010-12-14
    相关资源
    最近更新 更多