Reputation: 85
I am asking You to help me get over that error:
'NewAnnouncementForm' has no attribute 'error_messages'
So, I have a "Announcement" model:
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)
And I am trying to make a form and view to allow user add his announcements. Here is my form:
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
And views.py which is a main problem i guess:
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})
The problem I am facing since few hours is that after trying to submit form, I get error: 'NewAnnouncementForm' has no attribute 'error_messages'
Same error messages script works well for registration and it's form so I don't think it's connected to imports.
Upvotes: 2
Views: 695
Reputation: 477513
You should not use .error_messages
. This is something that is a dictionary to show the possible error messages for a certain field. A form has a .errors
attribute [Django-doc] that specifies the errors:
for field, items in form.errors.items():
for item in items:
messages.error(request, '{}: {}'.format(field, item))
Upvotes: 3