我想要做的是显示单个表单,该表单允许用户:

  • 输入文档标题(来自Document型号)
  • 从下拉列表(由UserDefinedCode型号填充)中 Select 他们的user_defined_code个选项之一
  • 键入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)

我的ModelForm

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

推荐答案

关于在表单中显示外键字段,您可以使用forms.ModelChoiceField并向其传递一个查询集.

所以,表格.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.

实际上,您的Document个对象不会有.code_set,因为FK关系是在您的文档模型中定义的.它定义了与Code的多对一关系,这意味着每个Code对象可以有多个Document个对象,而不是反过来.您的Code个对象的值将为.document_set.您可以从Document对象中执行的操作是访问与使用document.code相关的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)

Django相关问答推荐

如果密码在Django中未被散列,则对其进行散列

Django后端对印前判断请求未通过访问控制判断给我以下回应:否访问控制允许来源

Django REST序列化程序TO_REATION失败

当前路径 **/POST 与其中任何一个都不匹配

如何在Django模板中有条件地传递值给with变量?

root urls.py 是 Django 中的 config/urls.py 吗?

相同的字符串不同的翻译

使用 args 和选项编写自定义管理命令 - 所需字段说明

Django - 站点匹配查询不存在

将计数字段添加到 django rest 框架序列化程序

Django:想要将一个空字段显示为空白而不是显示无

如何查看 Django 调试工具栏?

直接在Django的模板中访问ForeignKey

django- nginx: [emerg] open() "/etc/nginx/proxy_params" 在 /etc/nginx/sites-enabled/myproject:11 中失败(2:没有这样的文件或目录)

使用 XMLHttpRequest 提示下载文件

如何在Django中获取一个组的所有用户?

在 Django 1.8 或更高版本中填充时出现Models aren't loaded yet"错误

如何在 Django 中触发 500 错误?

Django查询否定

升级到 Django 1.8 后提供的固定默认值