在 Django 中,如何将 ForeignKey 传递给 Model 的实例?

Posted

技术标签:

【中文标题】在 Django 中,如何将 ForeignKey 传递给 Model 的实例?【英文标题】:In Django, how do you pass a ForeignKey into an instance of a 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 的用户。

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

【问题讨论】:

【参考方案1】:

Django 中的一个典型模式是:

    从模型表单中排除 user 字段 用commit=False保存表格 设置job.user 保存到数据库

在你的情况下:

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 是不可变的

以上是关于在 Django 中,如何将 ForeignKey 传递给 Model 的实例?的主要内容,如果未能解决你的问题,请参考以下文章

Django REST 框架——如何将 ForeignKey 解析为实际值,而不是索引?

如何在 Django Admin 中更改 ForeignKey 显示文本?

Django 如何使 ForeignKey 使用默认值?

如何在 django 中获取所有 ForeignKey 的列表

如何在 DJango 管理界面中显示 ForeignKey 反向查找列表?

如何在数据表服务器端呈现 Django ForeignKey 关系