代码之家  ›  专栏  ›  技术社区  ›  Sachin

视图保存到同一模型但不同的实例-不起作用

  •  1
  • Sachin  · 技术社区  · 3 年前

    我有一个视图,可以通过html页面将表单详细信息保存到两个不同的Person对象(具有不同的ID),但它们位于同一个表中(位于不同的行上)

    看法

    person = Person.objects.filter(pk = user.related_person_id).first()
    medical_emergency_person = Person.objects.filter(related_entity=medical_emergency_entity).first()
    
    if request.method == "POST":
       form1 = PersonUpdateForm(request.POST, instance=person)
       form5 = MedicalPersonUpdateForm(request.POST, instance=medical_emergency_person)
    
       form1.save()
       form5.save()
    else:
        form1 = PersonUpdateForm(
            initial= {
               "title": person.title,
               "first_name": person.first_name,
               "last_name": person.last_name,
               "alias": person.alias
            }
        )
        form5 = MedicalPersonUpdateForm(
            initial= {
               "title": medical_emergency_person.title,
               "first_name": medical_emergency_person.first_name,
               "last_name": medical_emergency_person.last_name,
            }
        )
    
    context['personal_person_form'] = form1
    context['personal_medical_emergency_person_form'] = form5
    

    形式

    class MedicalPersonUpdateForm(forms.ModelForm):
    
    # FORM META PARAMETERS
    class Meta:
        model = Person
        fields = ('title', 'first_name', 'last_name')
        labels = {
            'title': _("Title*"),
            'first_name': _("Emergency Contact First Name*"),
            'last_name': _("Emergency Contact Last Name*")
            }
    
    # FORM INITIALISATION TO SET HTML STYLING
    def __init__(self, *args, **kwargs):
        super(MedicalPersonUpdateForm, self).__init__(*args, **kwargs)
        self.fields['title'].widget.attrs['class'] = 'input'
        self.fields['first_name'].widget.attrs['class'] = 'input is-danger'
        self.fields['last_name'].widget.attrs['class'] = 'input is-danger'
    
    
    class PersonUpdateForm(forms.ModelForm):
    
    # FORM META PARAMETERS
    class Meta:
        model = Person
        fields = ('title', 'first_name', 'last_name', 'alias')
        labels = {
            'title': _("Title*"),
            'first_name': _("First Name*"),
            'last_name': _("Last Name*"),
            'alias': _("Alias")
            }
    
    # FORM INITIALISATION TO SET HTML STYLING
    def __init__(self, *args, **kwargs):
        super(PersonUpdateForm, self).__init__(*args, **kwargs)
        self.fields['title'].widget.attrs['class'] = 'input'
        self.fields['first_name'].widget.attrs['class'] = 'input is-danger'
        self.fields['last_name'].widget.attrs['class'] = 'input is-danger'
        self.fields['alias'].widget.attrs['class'] = 'input is-danger'
    

    后果

    我正在经历的行为是,在数据库中,两个人的记录都是用表格5中的细节写的?然后当页面重新加载请求时。post,对于页面上的字段,firstname和lastname字段集都只显示表单5中的详细信息,而不是表单1和表单5中的详细信息。我做错了什么?

    1 回复  |  直到 3 年前
        1
  •  1
  •   willeM_ Van Onsem    3 年前

    两者都有相同的字段名。你可以通过使用 prefix=… :

    if request.method == 'POST':
        form1 = PersonUpdateForm(request.POST, prefix='person', instance=person)
        form5 = MedicalPersonUpdateForm(request.POST, prefix='medical', instance=medical_emergency_person)
        if form1.is_valid() and form5.is_valid():
            form1.save()
            form5.save()
            return redirect('name-of-some-view')
        
    else:
        form1 = PersonUpdateForm(prefix='person', instance=person)
        form5 = MedicalPersonUpdateForm(prefix='medical', instance=medical_emergency_person)
    context['personal_person_form'] = form1
    context['personal_medical_emergency_person_form'] = form5

    笔记 :如果POST请求成功,您应该 redirect [Django-doc] 实施 Post/Redirect/Get pattern [wiki] . 这样可以避免在用户刷新日志时发出相同的POST请求