Django编辑表单不保留值

2024-09-28 01:25:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个为addedit表单创建一个简单的Django表单。 我的问题是在people字段中使用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})

在表单.py在

^{pr2}$

html页面:

     <form  enctype="multipart/form-data" method="POST" action="">{% csrf_token %}
     {{form.peaople}}
     .........
     <input type="submit" value="create">
     </form>

Tags: instanceformadd表单returnifrequestsave
2条回答

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

  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. 用保存的值初始化窗体
^{pr2}$

为什么要手动指定peaople字段?可能这些数据没有保存在工作模型.people字段并手动保存到其他位置?考虑到ModelChoiceField是单值的,那么该字段很可能是ForeignKey 并且命名不同(而不是peaople):如果模型窗体的自定义字段与模型上具有相同名称的字段不匹配,则默认情况下不会填充该字段。在

可能的解决方案:

  • 如果模型字段名与模型上的字段不同,那么在初始化表单时应该传递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()

  • 如果work模型上的peaople字段不是FK(例如TextField),则需要在表单初始化后“手动设置”field.initial
^{pr2}$

相关问题 更多 >

    热门问题