表单提交后页面未重定向

时间:2019-10-22 06:41:02

标签: python django forms django-views

我有一个创建新类别的表格。以前,该表单位于其他模板中,可以很好地工作,但是由于它只是一个简单的表单,因此我决定以模式形式呈现它,而不是重定向到另一个页面。

用户可以添加新类别,但是在表单提交后,不会显示成功消息和页面呈现。仅在刷新页面时才会显示。响应消息是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>

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

1 个答案:

答案 0 :(得分:0)

即使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

相关问题