【问题标题】:form instance not displayed in widgets表单实例未显示在小部件中
【发布时间】:2013-08-08 12:02:30
【问题描述】:

views.py

def save_report(request):
    form = ReporterRegisterForm()
    profileform = ProfilecontactForm()
    user = request.user
    userprofile = UserProfile.objects.get(user=user)
    if request.method == 'POST':        
        id = request.POST.get('id')
        user = User.objects.get(pk=id)        
        userprofile = UserProfile.objects.get(user=user.id)
        form = ReporterRegisterForm(request.POST, instance=user) 
        profileform = ProfilecontactForm(request.POST,instance = userprofile)
        if form.is_valid() and profileform.is_valid(): 
            form.save()
            profilesave = profileform.save(commit=False)            
            profilesave.save()
    return render(request, 'setting/edit_reporter.html',
                   {'form': form,
                     'userprofile':userprofile
                    })

urls.py

urlpatterns = patterns(
    'setting.views',
    (r'^$', 'index'),      
    (r'^save-reporter/$', 'save_reporter'),)

js:

$('.reporter').click(function () {       
        alert(1)     
        var id = $(this).attr('id');  
        var csrf_token = $("#csrf_token").val();
        $.ajax({ 
           data:{
                csrfmiddlewaretoken: ('{{csrf_token}}'),   
               // form:form.serialize(),            
                id:id,

                },
        type:'POST',
        url: '/setting/save-reporter/',
        success: function() {
            $('#authorisedreporter').show();
        }
      });
     });

html:

<button type="button" id="{{ list.0.id }}" class="openDiv">{{list.0.name}} </button>

{{ list.0.id }} list中的id是用户表中的id

这是我的views.py来更新表单数据。我想实例化表单数据,需要在更新模式下显示该字段。它没有被实例化。我从POST获得正确的ID。需要帮助

【问题讨论】:

  • 我不确定你想要完成什么,但你没有返回 ProfileContactForm 对象,所以它没有被正确渲染?
  • @MikkoP,这是一个编辑问题,Rohan 的答案是显示登录用户的实例。但我想显示从 ajax 帖子获取的用户实例。我从 ajax 帖子中获取了正确的 ID,但是在控制台中,如果我在 html 中看到它,我收到的表单错误消息为“此字段是必需的”,而不是显示该字段为空的实例。你能帮我解决这个问题吗
  • 你能从 urls.py 分享这个视图的代码吗?
  • @MikkoP urls.py 共享
  • 由于您没有在 url 中包含您计划编辑的用户 ID,您打算如何访问它?我会把它改成这样: urls.py url(r'^(?P\d+)/$', myapp.views.save_report, name='save_report'), views.py def save_report(request , pk): ... 现在可以简单地引用 pk (在这种情况下,它是从 ajax 调用传递的用户 id。你能否也显示 ajax 调用。现在我不知道你是如何传递的视图上的用户 ID 信息。

标签: python django django-models django-forms django-templates


【解决方案1】:

假设您想用request.user 填充表单。如果要为其他用户填充,则需要从 url 获取 id,然后检索 useruserprofile

所以你的视图可以更新为

def save_report(request):
    user = request.user
    userprofile = UserProfile.objects.get(user=user)
    form = ReporterRegisterForm(instance=user)
    profileform = ProfilecontactForm(instance=userprofile)

    if request.method == 'POST':        
        form = ReporterRegisterForm(request.POST, instance=user) 
        profileform = ProfilecontactForm(request.POST,instance = userprofile)
        if form.is_valid() and profileform.is_valid(): 
            form.save()
            profilesave = profileform.save(commit=False)            
            profilesave.save()
    return render(request, 'setting/edit_reporter.html',
                   {'form': form,
                     'userprofile':userprofile
                    })

【讨论】:

  • 我使用了你的 sn-p,它显示了当前用户(登录用户)的实例。我想显示另一个用户的实例。我从 ajax 帖子中获取另一个用户的 id。我需要实例化该用户的详细信息。如何继续。
  • @Royal,正如我在回答中所说,您需要从 url 获取 id,然后使用它获取适当的用户实例。
【解决方案2】:

所以我会这样做:

在你的 html 模板中包含它(如果你想用 display: none 隐藏它)。 my_id 是你必须以某种方式传递的上下文变量。

&lt;div id="save-url" rel="{% url "save_reporter" pk=my_id %}" &gt;&lt;/div&gt;

然后在你的ajax调用中你可以获取url:

$.ajax({
   type: 'GET',
   url: $('#save-url').attr('rel'),
...

您的网址将如下所示:

url(r'^save-reporter/(?P<pk>\d+)/$', myapp.views.save_report, name='save_report'), 

你的看法是这样的:

views.py def save_report(request, pk):
     user = User.objects.get(id=pk)

现在 pk 是您从 ajax 调用传递的用户 ID。 顺便说一句,您发布的网址是指 save_reporter,该函数称为 save_report。

附:无意冒犯,但您应该多花一点时间来尽可能清楚地表述您的问题并包含相关信息。

编辑:明白了。这太有趣了。我原以为你可以用你所拥有的来访问 id,但你可以试试

id = request.POST['id']

无论如何,这不是一种非常“Django”的做事方式,您应该在 url 中包含 id(请参阅我上面的回答)。

【讨论】:

  • 我会在你的帮助下尝试样品,如果需要帮助会评论你。
  • 我在模板中以表格格式显示用户配置文件详细信息。我为用户名放置了一个按钮,如果单击用户名按钮,隐藏的 div 应该以表格格式显示的用户配置文件打开,即表格字段实例。这是我正在尝试做的事情
  • 因此您的模板上有多个表单。听着,恐怕我不得不停在这里,因为听起来你的代码在结构上有点缺陷。如何创建将用户重定向到 UpdateView 的按钮,其中 url 参数对应于您要更新的 UserProfile。此外,您应该在模板中包含一个 sn-p。
  • 感谢您的评论,我不知道该怎么做,我已经为我的源代码创建了 github,我也注意到了这一行。请以正确的方式参考和指导我github.com/Royalreena/Django
  • 抱歉,这是一个太大的项目,无法开始详细指导。我认为你应该做的是列出所有记者的名单,旁边有一个“编辑”按钮。然后,此编辑按钮会将您重定向到 UpdateView(请参阅 Django 文档)。 UpdateView 的 url 应该包含要编辑的用户的 id。 UpdateView 显然会包含表单。在 Django 中处理多个表单对象有点棘手,动态生成它们更是如此,所以我建议不要这样做,除非你真的知道自己在做什么。
猜你喜欢
  • 2013-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-23
  • 2018-03-14
  • 2021-04-26
  • 1970-01-01
  • 2021-05-29
相关资源
最近更新 更多