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>
Можете ли вы проверить, работает ли это? Я надеюсь, что это поможет.