DJANGO: формы не показывают ошибку пользователю (def post + ListView)

Можете ли вы мне помочь? Не могу решить проблему: у меня не показывает ошибку валидации когда я пишу неуникальный slug в форме -> ошибки в форме нет

Я думаю, что проблема в использовании def post() или return redirect после валидации формы. Я пробовал много разных решений, но ничего не помогает.

Может быть, вам следует использовать нестандартный способ сообщения об ошибке?

models.py

class ShortUrl(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name='Автор URL', null=True)
    url = models.CharField('Ссылка', max_length=200)
    slug = models.SlugField('Короткое имя ссылки', unique=True, max_length=20)

    def __str__(self):
        #return self.slug
        return f"Короткая ссылка: {self.user} >> {self.slug}"
    ​
    class Meta:
        verbose_name = 'Ссылка'
        verbose_name_plural = 'Ссылки

forms.py

class ShortURLForm(forms.ModelForm):
    slug = forms.SlugField(
        label='Название URL',
        required=True,
        widget=forms.TextInput(attrs={'placeholder': 'Укажите уникальный URL'})
    )
    
    url = forms.CharField(
        label='Ссылка',
        required=True,
        widget=forms.TextInput(attrs={'placeholder': 'Ссылка которую нужно сократить'})​
    )

    class Meta:
        model = ShortUrl
        fields = ['user', 'url', 'slug']
        widgets = {'user': forms.HiddenInput()}

views.py

class ShortURLPage(LoginRequiredMixin, ListView):
    model = ShortUrl
    template_name = 'main/shorts.html'
    context_object_name = 'shorts'
​
    def get_context_data(self, *, object_list=None, **kwargs):
        ctx = super(ShortURLPage, self).get_context_data(**kwargs)
        ctx['form'] = ShortURLForm()
        userurls = ShortUrl.objects.filter(user=self.request.user)
        ctx['shorts'] = userurls
        ctx['title'] = 'Добавление ссылок'
        return ctx
​
    def post(self, request, *args, **kwargs):
        post = request.POST.copy()
        post['user'] = request.user
        request.POST = post
        form = ShortURLForm(request.POST)
​
        if form.is_valid():
            slug = form.cleaned_data['slug']
            url = form.cleaned_data['url']
            form.save()
​
        return redirect('shorts')

shorts.html

                <form method="post" class="form">
                    {% csrf_token %}
                    {{ form }}            
                    <button class="button" type="submit">Создать ссылку</button>
                </form>

Ок, вы не так далеко продвинулись в достижении желаемого. В целом, ваш метод отправки сообщений должен выглядеть следующим образом:

    def post(self, request, *args, **kwargs):
        post = request.POST.copy()
        post['user'] = request.user
        request.POST = post
        form = ShortURLForm(request.POST)
​
        if form.is_valid():
            slug = form.cleaned_data['slug']
            url = form.cleaned_data['url']
            form.save()
        else:
            context = {
                'form': form,
            }
            return render(
                request, 
                self.template_name, 
                context,
            )

        return redirect('shorts')

Затем, вы должны написать ваш шаблон shorts.html следующим образом:

<form method="post" class="form">
        {% csrf_token %}
        {{ form.non_field_errors }}
        {{ form.errors }}
        {{ form }}            
        <button class="button" type="submit">Создать ссылку</button>
</form>

Можете ли вы проверить, работает ли это? Я надеюсь, что это поможет.

Вернуться на верх