首页 > 解决方案 > 在提交到带有详细信息的谢谢页面后尝试保存 django 表单数据

问题描述

如果我在表单提交页面中添加重定向 url,页面正在重定向,但表单数据没有保存到 db。如果我删除重定向 url,表单数据将被保存,但我的重定向不起作用。我需要重定向到包含活动详细信息以及感谢信息的页面。

请让我知道我要去哪里错了..

#forms.py

class UserForm(forms.ModelForm):
    class Meta:
        model = webinar_user
        fields = ['first_name', 'last_name', 'email_id', 'contact_no', 'city', 
        'state','postal_code','country','company']

#views.py

def post_detail(request, slug):
    template_name = "site/new_form.html"
    event = get_object_or_404(webinar_event, slug=slug)
    # event = get_object_or_404(webinar_event, pk=post_id)
    # success_url = "events:thankyou"
    user_data= None
    if request.method == "POST":
        user_form = UserForm(data=request.POST)
        print("form")
        if user_form.is_valid():
            print("form valid")
            user_data= user_form.save(commit=False)
            user_data.event= event
            req= user_data.save()

            subject = 'Thank You for registering for the webinar'
            context={'first_name':user_data.first_name, 'title':event.title, 
            'description':event.about_event, 'event_date':event.event_date, 
            'event_time':event.event_time, 'event_duration':event.event_duration}

            message = get_template('site/emails/thank_you.html').render(context)
            email_from = settings.EMAIL_HOST_USER
            email_id = user_form.cleaned_data['email_id']
            recipient_list = [email_id, ]
            email = EmailMessage(subject, message, email_from, recipient_list)
            email.content_subtype = 'html'
            email.send()

            return HttpResponseRedirect('events:thank_you', kwargs={'id':req.id})
)
    else:
        user_form = UserForm()

    return render(
        request,
        template_name,
        {
            "event": event,
            "user_data":user_data,
            "user_form": user_form
        },
    )

def thank_you(request, id):

    event = webinar_event.objects.get(pk=id)
    return render(request, 'site/thankyou.html',
                              {'event' : event})

html代码

<div class="testbox">
     {% if event.event_image %}
     <img src={{event.event_image.url}}>
     {% endif %}
      <form action="{% url 'events:thank_you' event.id%}" method= "post">

          {% csrf_token %}

          <div class="banner">
          <h1>{{event.title}}</h1>
              <br>
              <hr>
              <h2>{{event.event_date}}</h2>
<!--            <img src={{event.image.url}}>-->

        </div>

标签: pythonhtmldjango

解决方案


该类HttpResponseRedirect不进行 URL 解析。

你可以做

url = resolve_url('events:thank_you', kwargs={'id':req.id}))
return HttpResponseRedirect(url)

或者最好

from django.shortcuts import redirect
# ...
return redirect('events:thank_you', id=req.id)

...并且在将来,通过使用CreateView基类而不是手动编码表单视图来节省自己的精力:)


推荐阅读