django编辑表单不保留值

时间:2019-04-17 18:41:42

标签: python django django-forms

我为addedit表单创建了一个简单的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>

2 个答案:

答案 0 :(得分:0)

该值未保留,因为您没有将其保存在任何地方,也没有分配它。

  1. 将值保存在某个地方。
# 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()
  1. 使用保存的值初始化表单
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