首页 > 解决方案 > 表单提交后页面不重定向

问题描述

我有一个创建新类别的表格。以前,该表单位于另一个工作正常的模板中,但由于它只是一个简单的表单,我决定以模态形式呈现它,而不是重定向到不同的页面。

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

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

表格.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']

视图.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>

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

标签: pythondjangoformsdjango-views

解决方案


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


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

我宁愿建议你使用一个FormView或者更确切地说是一个通用的视图。(文档)。您无需自己处理表格。

@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


推荐阅读