当前位置: 首页 > 面试题库 >

如何在Django中的ModelForm中添加外键字段?

辛可人
2023-03-14
问题内容

我想做的是显示一个单一的表格,让用户:

  • 输入文档标题(来自Document模型)
  • user_defined_code从下拉列表中选择一个选项(由UserDefinedCode模型填充)
  • 输入unique_code(存储在Code模型中)
    我不确定如何在表单中显示外键关系的字段。我知道在视图中你可以使用document.code_set(例如)访问当前document对象的相关对象,但是我不确定如何将其应用于ModelForm。

我的模特:

class UserDefinedCode(models.Model):
    name = models.CharField(max_length=8)
    owner = models.ForeignKey(User)

class Code(models.Model):
    user_defined_code = models.ForeignKey(UserDefinedCode)
    unique_code = models.CharField(max_length=15)

class Document(models.Model):
    title = models.CharField(blank=True, null=True, max_length=200)
    code = models.ForeignKey(Code)
    active = models.BooleanField(default=True)

我的模型表格

class DocumentForm(ModelForm):
    class Meta:
        model = Document

问题答案:

关于以表格形式显示外键字段,你可以使用forms.ModelChoiceField并将其传递给queryset。

因此,forms.py:

class DocumentForm(forms.ModelForm):
    class Meta:
        model = Document

    def __init__(self, *args, **kwargs):
        user = kwargs.pop('user','')
        super(DocumentForm, self).__init__(*args, **kwargs)
        self.fields['user_defined_code']=forms.ModelChoiceField(queryset=UserDefinedCode.objects.filter(owner=user))

views.py:

def someview(request):
    if request.method=='post':
        form=DocumentForm(request.POST, user=request.user)
        if form.is_valid():
            selected_user_defined_code = form.cleaned_data.get('user_defined_code')
            #do stuff here
    else:
        form=DocumentForm(user=request.user)

    context = { 'form':form, }

    return render_to_response('sometemplate.html', context, 
        context_instance=RequestContext(request))

从你的问题:

我知道在视图中你可以使用document.code_set(例如)访问当前文档对象的相关对象,但是我不确定如何将其应用于ModelForm。

实际上,由于FK关系是在文档模型中定义的,因此你的Document对象将没有.code_set。它与定义了多对一关系Code,这意味着Document每个Code对象可以有多个对象,而不是相反。你的Code对象会有一个.document_set。你可以从文档对象执行的操作Code是与使用相关的访问document.code

编辑:我认为这将做你想要的。(未试)

forms.py:

class DocumentForm(forms.ModelForm):
    class Meta:
        model = Document
        exclude = ('code',)

    def __init__(self, *args, **kwargs):
        user = kwargs.pop('user','')
        super(DocumentForm, self).__init__(*args, **kwargs)
        self.fields['user_defined_code']=forms.ModelChoiceField(queryset=UserDefinedCode.objects.filter(owner=user))
        self.fields['unique_code']=forms.CharField(max_length=15)

views.py:

def someview(request):
    if request.method=='post':
        form=DocumentForm(request.POST, user=request.user)
        if form.is_valid():
            uniquecode = form.cleaned_data.get('unique_code')
            user_defined_code = form.cleaned_data.get('user_defined_code')
            doc_code = Code(user_defined_code=user_defined_code, code=uniquecode)
            doc_code.save()
            doc = form.save(commit=False)
            doc.code = doc_code
            doc.save()
            return HttpResponse('success')
    else:
        form=DocumentForm(user=request.user)

    context = { 'form':form, }

    return render_to_response('sometemplate.html', context, 
        context_instance=RequestContext(request))

实际上,你可能想在创建Code对象时使用get_or_create而不是此方法。

doc_code = Code(user_defined_code=user_defined_code, code=uniquecode)


 类似资料:
  • 问题内容: TL; DR:如何在ModelForm中为ForeignKey添加“添加新”按钮? 长版:我在项目中使用Django 1.7。我的models.py中有这两个模型 [省略了一些其他不相关的字段] 我正在使用ModelForm用新命令填充数据库,如下所示: Django在为客户字段添加下拉菜单方面做得很好,并在其中添加了来自客户的条目。不过,我想拥有一个“添加新客户”链接/按钮/以便在添

  • 我在MySQL中有一个名为的表 提供以下输出, 下面提供了表,

  • 问题内容: 说我的内容如下: 即有多个,每个都有一个和的范围。每个数据库都应有一个从其父数据库中选择的基础,而不是另一个。 创建用于添加的表单时,我想删除选择(因为已经通过页面上的“添加客户端”按钮Rate选择了该选项),并且也将选择限制于此。 我该如何在Django 1.0中做到这一点? 目前,我当前的文件只是样板文件: 而且也是基本的: 在Django 0.96中,我能够通过在渲染模板之前进行

  • 问题内容: 说我的内容如下: 即有多个,每个都有一个和的范围。每个数据库Client都应有一个Rate从其父数据库中选择的基础,而不是另一个。 创建用于添加的表单时,我想删除选择(因为已经通过页面上的“添加客户端”按钮选择了该选项),并且也将选择限制于此。 我该如何在Django 1.0中做到这一点? 目前,我当前的forms.py文件只是样板文件: 而且views.py也是基本的: 在Djang

  • 问题内容: 无论如何,在Django中是否可以为双外键建模? 例如,如果我有以下表格:音频,覆盖,html和表格:timeline_item,它具有一个字段ID,以及一个指定音频,覆盖或html的字段类别… 有谁知道我将如何在Django中进行建模?甚至有可能吗? 问题答案: 听起来像是多态关联。也许您可以使用ContentTypes框架解决Django通用关系的问题。

  • 新用户:从一月份开始学习Java,现在我正在使用NetBeans,如果我写这个简单的快捷方式,我会得到大量的错误。 所以IDE只是告诉我,我几乎做错了一切。在setOnKeyPressed的线路上,我得到了 我导入了所有内容,并从StackOverflow.com上的另一个问题(可能是有效的)中复制了这段代码。我只想按“esc”,并在root被聚焦的情况下关闭我的primarystage(不管是不