【问题标题】:Page not redirecting after form submit表单提交后页面不重定向
【发布时间】:2020-02-18 06:11:44
【问题描述】:

我有一个创建新类别的表单。以前,表单在不同的模板中运行良好,但由于它只是一个简单的表单,我决定以模态形式呈现它,而不是重定向到不同的页面。

用户可以添加一个新的类别,但是没有显示成功消息和表单提交后的页面渲染。它仅在您刷新页面时显示。响应消息为 302。

我用其他形式做了类似的方法,效果很好。

forms.py

class CategoryModelForm(forms.ModelForm):
    def clean_name(self):
        print(self.cleaned_data['name'])
        name = self.cleaned_data['name']

    try:
        Category.objects.get(name__iexact=name)
    except ObjectDoesNotExist:
        return name
    raise forms.ValidationError('Category Name already exists.')


class Meta:
    model = Category
    fields = ['name']

views.py

@method_decorator(login_required, name='dispatch')
class CategoryView(TemplateView):
    template_name = 'content/category_list.html'


def get_context_data(self, **kwargs):
    context = super(CategoryView, self).get_context_data(**kwargs)
    categories = Category.objects.all()
    user = self.request.user
    category_list = []
    for category in categories:
        article_count = category.article_count(user)
        include = category.show or user.usertype_is_staff() or user.is_superuser
        requested_by = category.requested_by if category.requested_by else ''
        cat = {
            'reference': category.pk,
            'name': category.name,
            'show': category.show,
            'article_count': article_count,
            'has_articles': article_count > 0,
            'requested_by': requested_by,
            'requested_by_name': requested_by.profile.full_name if requested_by and requested_by.profile.full_name
            else '-'
        }
        include and category_list.append(cat)

    context['categories'] = category_list
    context['form'] = CategoryModelForm(self.request.POST or None)

    return context


def post(self, request, *args, **kwargs):
    context = self.get_context_data(**kwargs)
    if context['form'].is_valid():
        context['form'].save()
        messages.success(request, 'Successfully created new category.')
        return redirect('content:category')
    return super(CategoryView, self).render_to_response(context)

category_list.html

<div id="newCategory" data-id="new-account" class="modal fade bd-example-modal-lg"
             tabindex="-1" role="dialog" aria-labelledby="myLargeModalLabel" aria-hidden="true">
          <div class="modal-dialog modal-lg">
            <div class="modal-content">
             <div class="syn-breadcrumb">
                <div class="syndicator-form-container">
                   <form class="syndicator-form" action="{% url 'content:category' %}"
                      method="post">
                    {% csrf_token %}
                    <div class="">
                        <h3 class="lighter-weight">
                            {% if user.usertype_is_supplier %}
                                Request New Category
                            {% else %}
                                Add New Category
                            {% endif %}
                        </h3>
                    </div>
                    <div class="form-fields">
                        <div class="non-field-errors">
                            {{ form.non_field_errors }}
                        </div>
                        <div id="{{ form.name.name }}" class="d-flex flex-column fields">
                            <div class="lighter-weight"><label for="id_name">Name</label></div>
                            <div>{{ form.name }}</div>
                            <div class="field-errors">{{ form.name.errors }}</div>
                        </div>
                    </div>
                    <div class="submit-button">
                        <button type="submit" class="btn btn-primary form-control">{% trans 'Submit' %}</button>
                    </div>
                </form>
                </div>
            </div>
        </div>
    </div>
</div>

我希望在表单提交成功消息后将页面重定向到更新的类别列表。如果类别名称已存在或字段为空,则显示错误消息。

【问题讨论】:

    标签: python django forms django-views


    【解决方案1】:

    您使用的是self.request 而不是request,即使request 已经在post 方法中传递了

    
    def post(self, request, *args, **kwargs):
        context = self.get_context_data(**kwargs)
        context['form'] = CategoryModelForm(request.POST or None)  # use request.POST
    

    我宁愿建议您使用FormView 或更通用的视图。 (docs)。您无需自己处理表单。

    @method_decorator(login_required, name='dispatch')
    class CategoryView(FormView):
        template_name = 'content/category_list.html'
        form = CategoryModelForm
        success_url = reverse("content:category")
    
        def form_valid(self, form):
            self.obj = form.save(commit=True)
            messages.success(self.request, 'Successfully created new category.')
            return super(CategoryView, self).form_valid(form)
        def get_context_data(self, **kwargs):
            context = super(CategoryView, self).get_context_data(**kwargs)
            categories = Category.objects.all()
            user = self.request.user
            category_list = []
            for category in categories:
                article_count = category.article_count(user)
                include = category.show or user.usertype_is_staff() or user.is_superuser
                requested_by = category.requested_by if category.requested_by else ''
                cat = {
                    'reference': category.pk,
                    'name': category.name,
                    'show': category.show,
                    'article_count': article_count,
                    'has_articles': article_count > 0,
                    'requested_by': requested_by,
                    'requested_by_name': requested_by.profile.full_name if requested_by and requested_by.profile.full_name
                    else '-'
                }
                include and category_list.append(cat)
    
            context['categories'] = category_list
            # form will be automatically added to context
    
    

    【讨论】:

    • 首先,我的错误,context['form'] 不应该存在,只是在 get_context_data 中。其次,我想只使用 TemplateView,因为所有类别都显示在页面上。因为它适用于我的其他形式,所以我想保持统一。我只是想知道是什么导致了响应状态 302。
    猜你喜欢
    • 1970-01-01
    • 2014-07-12
    • 1970-01-01
    • 2020-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-10
    • 1970-01-01
    相关资源
    最近更新 更多