我为add
和edit
表单创建了一个简单的Django表单。
我的问题是在使用ModelChoiceField
的人员字段中。
在编辑表单中,除该字段ModelChoiceField
外,所有值都解析正确。
在编辑表单中,该字段为空且不保留值,不知道为什么??
def edit_work(request, pk):
instance = get_object_or_404(work, id=pk)
form = workForm(request.POST or None,instance=instance)
if form.is_valid():
note = form.save(commit=False)
note.save()
return HttpResponseRedirect('/work/success/')
return render(request,'edit_work.html', {'form': form})
def add_work(request):
if request.method == "POST":
form = workForm(request.POST)
if form.is_valid():
note = form.save(commit=False)
note.save()
return render(request, "succes/erga_success.html")
else:
form = workForm()
return render(request, 'add_work.html',{'form':form})
forms.py
class workForm(forms.ModelForm):
peaople=forms.ModelChoiceField(queryset=User.objects.all(),required=False, error_messages={
'invalid': _("---")})
class Meta:
model = work
fields = (__all__")
html页面:
<form enctype="multipart/form-data" method="POST" action="">{% csrf_token %}
{{form.peaople}}
.........
<input type="submit" value="create">
</form>
答案 0 :(得分:0)
该值未保留,因为您没有将其保存在任何地方,也没有分配它。
# views.py
# in both view functions
if form.is_valid():
note = form.save(commit=False)
note.save()
somemodel.people = form.cleaned_data.get("people")
somemodel.save()
def edit_work(request, pk):
instance = get_object_or_404(work, id=pk)
form = workForm(request.POST or None,instance=instance, initial={'people': somemodel.people})
if form.is_valid():
note = form.save(commit=False)
note.save()
somemodel.people = form.cleaned_data.get("people")
somemodel.save()
return HttpResponseRedirect('/work/success/')
return render(request,'edit_work.html', {'form': form})
答案 1 :(得分:0)
为什么要手动指定peaople
字段?也许此数据未保存在WorkModel.peaople字段下,而是手动保存在其他位置?考虑到ModelChoiceField
是单个值,则该字段最有可能是ForeignKey
且命名不同(不是peaople
):如果ModelForm的自定义字段与模型上具有相同名称的字段不匹配,则默认情况下不会填充该字段。
可能的解决方案:
initial={'peaople': instance.some_human_fk_field}
参数。 some_human_fk_field
)的窗口小部件/标签/错误消息等更改为ModelChoiceField, 'people', {'invalid': _("---")}
,则完全don't need to define custom field:class workForm(forms.ModelForm):
class Meta:
model = work
fields = ("__all__")
labels = {
'some_human_fk_field': _('People'),
}
error_messages = {
'some_human_fk_field': {
'invalid': _("---"),
},
}
field_classes = {
'some_human_fk_field': forms.ModelChoiceField,
}
def __init__(self, *args, **kwargs):
super(workForm, self).__init__(*args, **kwargs)
self.fields['some_human_fk_field'].queryset = User.objects.all()
# Or you can dynamically determine queryset, for example you want to accout 'Work.owner.company' field:
# limiting_factor = None
# if self.instance.pk:
# limiting_factor = self.instance.owner.company
# elif self.data:
# _owner_pk = self.data.get('owner')
# limiting_factor = Company.objects.get(owners_set__pk=_owner_pk)
# elif self.initial and self.initial.get('owner'):
# limiting_factor = self.initial['owner'].company
# if limiting_factor:
# self.fields['some_human_fk_field'].queryset = build_qs_from_limiting_factor(
# User.objects.all(),
# company=limiting_factor
# )
# else:
# self.fields['some_human_fk_field'].queryset = User.objects.all()
peaople
模型上的work
字段不是FK(例如TextField),那么您需要在表单初始化后“手动设置” field.initial
:class workForm(forms.ModelForm):
...
def __init__(self, *args, **kwargs):
super(workForm, self).__init__(*args, **kwargs)
if self.instance.pk and self.instance.peaople:
self.fields['peaople'].initial = User.objects.filter(pk=self.instance.peaople) # or `username=self.instance.peaople` depending on what you are really saving there