FormName не имеет атрибута «error_messages» - PullRequest
1 голос
/ 06 февраля 2020

Я прошу Вас помочь мне преодолеть эту ошибку: 'NewAnnouncementForm' has no attribute 'error_messages'

Итак, у меня есть модель "Объявление":

class Announcement(models.Model):

    announcement = 'announcement'
    alert = 'alert'
    offer ='offer'

    announcement_types = (
    (announcement, 'Announcement'),
    (alert, 'Alert'),
    (offer, 'Offer'),
    )

    id = models.AutoField(auto_created=True, primary_key=True, serialize=True, verbose_name='ID')
    text = models.CharField(max_length=1500, null=False, blank=False)
    announcement_type = models.CharField(max_length=12, choices=announcement_types, default=announcement)
    user_name = models.ForeignKey(CustomUserModel, db_column='user_name', on_delete=models.CASCADE)
    date = models.DateTimeField(auto_now=True)
    price = models.DecimalField(max_digits=6, decimal_places=2)
    building_id = models.ForeignKey(Buildings, db_column='building_id', on_delete=models.CASCADE)

И я пытаюсь сделать Форма и вид, чтобы позволить пользователю добавлять свои объявления. Вот моя форма:

class NewAnnouncementForm(forms.ModelForm):

    text = forms.CharField(label='Treść ogłoszenia', max_length=1500)
    announcement_type = forms.ChoiceField(label='Typ ogłoszenia', widget=forms.RadioSelect, choices=Announcement.announcement_types)
    #user_name dodac do views przed savem i dodac w save (?)
    price = forms.DecimalField(label='Podaj oczekiwaną cenę, w przypadku darmowego ogłoszenia wpisz 0')
    user_name = forms.CharField(widget=forms.HiddenInput())
    building_id = forms.IntegerField(widget=forms.HiddenInput())

    class Meta(forms.Form):
        model = Announcement
        fields = ('text', 'announcement_type', 'price', 'user_name', 'building_id')

    def save(self, commit=True):
        announcement = super(NewAnnouncementForm, self).save(commit=False)
        announcement.text = self.cleaned_data['text']
        announcement.announcement_type = self.cleaned_data['announcement_type']
        announcement.price = self.cleaned_data['price']

        if commit:
            announcement.save()
        return announcement

И views.py, которая, как мне кажется, является главной проблемой:

def add_announcement(request):
    if request.user.is_authenticated:
        if request.method=='POST':
            username = str(request.user.username)
            user_object = CustomUserModel.objects.values_list('address', flat=True).get(username=username)
            form = NewAnnouncementForm(request.POST)
            form.fields['user_name'].initial = username
            form.fields['building_id'].initial = user_object
            if form.is_valid():
                announcement = form.save()
                messages.success(request, 'Dodano ogłoszenie')
                return redirect("map_neigh:index")
            else:
                for msg in form.error_messages:
                    messages.error(request, str(msg) + ": " + str(form.error_messages[msg]))

                return render(request = request,
                              template_name = "map_neigh/add.html",
                              context={"form":form})

        form = NewAnnouncementForm
        return render(request = request,
                      template_name = "map_neigh/add.html",
                      context={"form":form})

Проблема, с которой я столкнулся через несколько часов, заключается в том, что после попытки отправить форму , Я получаю сообщение об ошибке: 'NewAnnouncementForm' has no attribute 'error_messages' Тот же сценарий с сообщениями об ошибках хорошо работает для регистрации и имеет форму, поэтому я не думаю, что он связан с импортом.

1 Ответ

1 голос
/ 06 февраля 2020

Вы не должны использовать .error_messages. Это словарь для отображения сообщений об ошибках возможных для определенного поля. Форма имеет атрибут .errors [Django -doc] , который определяет ошибки:

for field, items in form<b>.errors.items()</b>:
    for item in items:
        messages.error(request, '{}: {}'.format(field, item))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...