Страница не перенаправляет после отправки формы - PullRequest
0 голосов
/ 22 октября 2019

У меня есть форма, которая создает новую категорию. Раньше форма была в другом шаблоне, который работал нормально, но, поскольку это всего лишь простая форма, я решил перевести ее в модальную форму вместо перенаправления на другую страницу.

Пользователь может добавить новую категорию,однако сообщение об успешном завершении и визуализация страницы после отправки формы не отображаются. Он появляется только при обновлении страницы. Ответное сообщение: 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 голосов
/ 22 октября 2019

Вы используете 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 или скорееобщий вид. ( 1010 * документы *). Вам не нужно обрабатывать форму самостоятельно.

@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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...