Django CreateView перенаправить на ListView, когда форма неверна - PullRequest
0 голосов
/ 10 мая 2018

у меня есть views.py как это

class InventoryListView(ListView):
    context_object_name = 'inventorys'
    model = models.Inventory

    def get_context_data(self, **kwargs):
        context = super(InventoryListView, self).get_context_data(**kwargs)
        context['form'] = InventoryForm()
        return context

class InventoryCreateView(CreateView):
    fields = ('name', 'sn', 'desc', 'employee')
    model = models.Inventory  

а вот мой models.py

class Inventory(models.Model):
    name = models.CharField(max_length=255)
    sn = models.DecimalField(max_digits=20, decimal_places=0)
    desc = models.TextField(blank=True, null=True, default='Empty')
    employee = models.ForeignKey(Employee, null=True, on_delete=models.SET_NULL, related_name='employee')
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True, null=True)

    def __str__(self):
        return self.name

    def get_absolute_url(self):
        return reverse("system:inventory_list")

а вот мой urls.py

url(r'^invn/$',views.InventoryListView.as_view(), name='inventory_list'),
url(r'^invn/create$',views.InventoryCreateView.as_view(), name='inventory_create'),

а вот мой inventory_list.html

{% for inventory in inventorys %}
  <td>{{ inventory.name }}</td>
{% endfor %}

<form method="post" action="{% url 'system:inventory_create' %}">
  {% csrf_token %}
  {{ form.as_p }}
</form>

если форма действительна, она хорошо работает.

Но если форма недействительна, она будет перенаправлена ​​на inventory_form.html, что приведет к TemplateDoesNotExist, так как Django CreateView нужно inventory_form.html (CMIIW).

простое решение создать inventory_form.html но это не то, что я хочу.

как сделать так, чтобы он перенаправлялся на мой ListView, когда форма недействительна с сообщениями об ошибках? ...

Ответы [ 2 ]

0 голосов
/ 10 мая 2018

Можно перенаправить пользователя внутри метода form_invalid() и использовать Django Message Framework , чтобы предупредить пользователя (сообщение об ошибке).

from django.contrib import messages
from django.shortcuts import redirect

class InventoryCreateView(CreateView):
    fields = ('name', 'sn', 'desc', 'employee')
    model = models.Inventory  


    def form_invalid(self, form):
        'form is invalid'
        messages.add_message(self.request,messages.WARNING,"Form is invalid")
        return redirect('inventory_list')

Чтобы получить сообщение в шаблоне:

{% if messages %}
    <ul class="messages">
    {% for message in messages %}
      <li{% if message.tags %} class="{{ message.tags }}"{% endif %}>{{ message }}</li>
    {% endfor %}
    </ul>
{% endif %}
0 голосов
/ 10 мая 2018

Легко перенаправить на ListView.

Просто переопределить form_invalid() в CreateView.

По умолчанию form_invalid() ниже

def form_invalid(self, form):
    """If the form is invalid, render the invalid form."""
    return self.render_to_response(self.get_context_data(form=form))

Вы можете перенаправить на ваш ListView.

Но проблема в том, что при перенаправлении вы не можете передать любой контекст илисообщение им.Он просто перенаправляет на ваш список.

Таким образом, у вас есть несколько вариантов.

Во-первых, вы можете оставить form_invalid() таким же, а если форма недействительна (вы можете проверить ее с ошибкой с помощью form.errors), отобразить сообщение об ошибке оповещения на странице CreateView с предупреждением или подтверждением, а при нажатиихорошо, перенаправить на страницу просмотра списка.

Во-вторых, вы можете использовать session.Перед перенаправлением в просмотр списка вы можете указать некоторые данные сеанса, чтобы решить, что они из недопустимого CreateView.

Я думаю, что первый - лучший подход для веба.

Если у вас есть какие-либо вопросы, просто прокомментируйте их.

...