努力使用两种具有相同功能视图的表单,并将其连接到特定的配置文件

时间:2019-01-27 19:24:33

标签: django django-models django-forms django-views

首先,我有一个名为Account的模型,该模型通过一对一字段绑定到Django的本机User模型。我正在建立一个管理面板,其目的是能够通过其后端个人资料页面上的表单来编辑注册的帐户(用户)信息。

我设法使用两种形式(用于更改用户模型的表单和用于更改帐户模型的表单)创建视图,但是由于实例为request.user,因此我只能编辑自己的视图有关不同配置文件的信息。我不确定如何将帐户pk绑定到代码中。

例如,最终目标是: http://path/to/user/profile/1-能够编辑帐户1的信息 http://path/to/user/profile/2-能够编辑帐户2的信息

我试图将pk添加到test的定义中,但是没有运气。

urls.py

urlpatterns = [
       path("test/<int:pk>", views.test, name="test"),
] 

views.py

def test(request, pk):

    if request.method == 'POST':
        u_form = UserEditPersonalForm(request.POST, instance=request.user)
        a_form = AccountEditPersonalForm(request.POST, instance=request.user.account)

        if u_form.is_valid() and a_form.is_valid():
            u_form.save()
            a_form.save()
            messages.success(request, f'Account updated')
            return redirect('/cms/test/')
    else:
        u_form = UserEditPersonalForm(instance=request.user)
        a_form = AccountEditPersonalForm(instance=request.user.account)

    context = {
        'u_form': u_form,
        'a_form': a_form
    }

    return render(request, 'cms/test.html', context)

1 个答案:

答案 0 :(得分:0)

这与“在同一基于函数的视图中使用两种形式”无关。请给您的问题一个标题,该标题实际上是指您的问题,即您要编辑给定用户的详细信息,而不是已登录的详细信息。

解决方案只是获取相关用户并将其传递,而不是将request.userrequest.user.account作为实例参数传递给表单:

def test(request, pk):
    user = User.objects.get(pk=pk)
    if request.method == 'POST':
        u_form = UserEditPersonalForm(request.POST, instance=user)
        a_form = AccountEditPersonalForm(request.POST, instance=user.account)

        if u_form.is_valid() and a_form.is_valid():
            ...
    else:
        u_form = UserEditPersonalForm(instance=user)
        a_form = AccountEditPersonalForm(instance=user.account)
    ...