关于以表格形式显示外键字段,你可以使用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_pre']=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_pre = form.cleaned_data.get('user_defined_pre') #do stuff here else: form=documentForm(user=request.user) context = { 'form':form, } return render_to_response('sometemplate.html', context, context_instance=RequestContext(request))从你的问题:
我知道在视图中你可以使用document.pre_set(例如)访问当前文档对象的相关对象,但是我不确定如何将其应用于ModelForm。
实际上,由于FK关系是在文档模型中定义的,因此你的
document对象将没有
.pre_set。它与定义了多对一关系Code,这意味着document每个
Code对象可以有多个对象,而不是相反。你的
Code对象会有一个
.document_set。你可以从文档对象执行的操作Code是与使用相关的访问
document.pre。
编辑:我认为这将做你想要的。(未试)
forms.py:
class documentForm(forms.ModelForm): class meta: model = document exclude = ('pre',) def __init__(self, *args, **kwargs): user = kwargs.pop('user','') super(documentForm, self).__init__(*args, **kwargs) self.fields['user_defined_pre']=forms.ModelChoiceField(queryset=UserDefinedCode.objects.filter(owner=user)) self.fields['unique_pre']=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(): uniquepre = form.cleaned_data.get('unique_pre') user_defined_pre = form.cleaned_data.get('user_defined_pre') doc_pre = Code(user_defined_pre=user_defined_pre, pre=uniquepre) doc_pre.save() doc = form.save(commit=False) doc.pre = doc_pre 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_pre = Code(user_defined_pre=user_defined_pre, pre=uniquepre)



