在一个视图中使用两个模型,您可以在 django 中保存和编辑

use two models in a single view that you can save and edit in django

零和一的恋人。 如何使视图具有两种不同模型的两种形式,但保存一种形式不会影响另一种形式?

尝试使用模型形式在单个视图中使用它。 但我想知道如何解决它或这些情况的最佳实践。

您可以在表单上使用按钮的 name 属性。例如;

<form>
...
<input type="submit" name="save-user" value="Save user" />
</form>
<form>
...
<input type="submit" name="save-category" value="Save category" />
</form>

然后在python中你可以像这样检测哪个按钮被点击了;

if 'save-user' in request.POST:
    # save the user
elif 'save-category' in request.POST:
    # save the category

好的,所以您想在模板中显示两个不同的表单并将它们分别保存到数据库中。

对我来说,我通常坚持目前为止最简单和最好的方法。

就这样吧,以这个为例

def update_profile(request):
    if request.method == 'POST':
        user_form = UserForm(request.POST, instance=request.user)
        profile_form = ProfileForm(request.POST, instance=request.user.profile)
        if user_form.is_valid() and profile_form.is_valid():
            user_form.save()
            profile_form.save()
            # redirect to somewhere else

        else:
            # message.error
    user_form = UserForm(instance=request.user)
    profile_form = ProfileForm(instance=request.user.profile)
return render(request, 'profiles/profile.html', {
    'user_form': user_form,
    'profile_form': profile_form
})

Django 非常聪明地处理 ModelForms,在执行了一些后台验证之后

form.is_valid()

被调用。

它将保存已更改的字段并忽略未更改的字段。

这是表单的模板渲染

<form method="post">
{% csrf_token %}
{{ user_form.as_p }}
{{ profile_form.as_p }}
<button type="submit">Save changes</button>
</form>

这是 forms.oh

class UserForm(forms.ModelForm):
    class Meta:
        model = User
        fields = ('first_name', 'last_name', 'email')

class ProfileForm(forms.ModelForm):
    class Meta:
        model = Profile
        fields = ('url', 'location', 'company')

就像我之前提到的,Django 足够聪明,可以处理您的 ModelForms,只要您调用它 form.is_valid() 它就会为您完成提升。

这对我来说是一种更简单的方法

如果你想要更可控的东西 Check out Django Formset

创建两个模型并在 ModelForm 中使用它:

class UserUpdateForm(ModelForm):

    class Meta:
        model = User
        fields = ["username", "email", "phone_number", "bioghraphy", "avatar"]

class AddressForm(ModelForm):
    class Meta:
        model = Address
        fields = "__all__"

在views.py中:

class AccountFormView(TemplateView):
      ...

  def post(self, request, *args, **kwargs):

    user_form = UserUpdateForm(
        request.POST, prefix="user", instance=self.get_object()
    )
    address_form = AddressForm(
        request.POST, prefix="address", instance=self.get_object_address()
    )

    if user_form.is_valid():
        user_form.save()
        return HttpResponseRedirect(
            reverse_lazy(
                "neeko.apps.accounts:accounts-landing",
                kwargs={"pk": self.get_object().pk},
            )
        )

    if address_form.is_valid():
        address_form.save()
        return HttpResponseRedirect(
            reverse_lazy(
                "neeko.apps.accounts:accounts-landing",
                kwargs={"pk": self.get_object().pk},
            )
        )

    return self.render_to_response(
        self.get_context_data(user_form=user_form, address_form=address_form)
    )

模板:

<form method="post">
    {% csrf_token %}
    {{ user_form.as_p }}
<button type="submit">form 1</button>
</form>
<h1>form segin</h1>

<form method="post">
    {% csrf_token %}
    {{ address_form.as_p }}
    <button type="submit">form 2 </button>
</form>

例子

https://gist.github.com/josuedjh3/7ea29c70a0167ff34a1216edb5dbed05