0
votes

UPDATE: I ended up creating a new forms.Form instead of using a ModelForm

In a ModelForm, I replaced a field by excluding it and adding a new one with the same name, as shown below in AddRestaurantForm. When saving the form with the code shown below, I get an error in form.save_m2m() ("Truncated incorrect DOUBLE value"), which seems to be due to the function to attempt to save the tag field, while it is excluded.

Is the save_m2m() function supposed to save excluded fields?
Is there anything wrong in my code?

Thanks
Jul

(...)
new_restaurant = form.save(commit=False)
new_restaurant.city = city
new_restaurant.save()

tags =  form.cleaned_data['tag']
if(tags!=''): tags=tags.split(',')
for t in tags:
    tag, created = Tag.objects.get_or_create(name = t.strip())
    tag.save()
    new_restaurant.tag.add(tag)

new_restaurant.save()
form.save_m2m()

models.py

class Tag(models.Model):
    name = models.CharField(max_length=100, unique=True)

class Restaurant(models.Model):
    name = models.CharField(max_length=50)
    city=models.ForeignKey(City)
    category=models.ManyToManyField(Category)
    tag=models.ManyToManyField(Tag, blank=True, null=True)

forms.py

class AddRestaurantForm(ModelForm):
    name = forms.CharField(widget=forms.TextInput(attrs=classtext))
    city = forms.CharField(widget=forms.TextInput(attrs=classtext), max_length=100)
    tag = forms.CharField(widget=forms.TextInput(attrs=classtext), required=False)

    class Meta:
        model = Restaurant
        exclude = ('city','tag') 

Traceback:

File "/var/lib/python-support/python2.5/django/core/handlers/base.py" in get_response
92. response = callback(request, *callback_args,
**callback_kwargs) File "/home/jul/atable/../atable/resto/views.py" in addRestaurant
498. form.save_m2m() File "/var/lib/python-support/python2.5/django/forms/models.py" in
save_m2m
75. f.save_form_data(instance, cleaned_data[f.name]) File "/var/lib/python-support/python2.5/django/db/models/fields/
related.py" in save_form_data
967. setattr(instance, self.attname, data) File "/var/lib/python-support/python2.5/django/db/models/fields/
related.py" in set
627. manager.add(*value) File "/var/lib/python-support/python2.5/django/db/models/fields/
related.py" in add
430. self._add_items(self.source_col_name, self.target_col_name, *objs) File "/var/lib/python-support/python2.5/django/db/models/fields/
related.py" in _add_items
497. [self._pk_val] + list(new_ids)) File "/var/lib/python-support/python2.5/django/db/backends/util.py" in
execute
19. return self.cursor.execute(sql, params) File "/var/lib/python-support/python2.5/django/db/backends/mysql/
base.py" in execute
84. return self.cursor.execute(query, args) File "/var/lib/python-support/python2.5/MySQLdb/cursors.py" in execute
168. if not self._defer_warnings: self._warning_check() File "/var/lib/python-support/python2.5/MySQLdb/cursors.py" in
_warning_check
82. warn(w[-1], self.Warning, 3) File "/usr/lib/python2.5/warnings.py" in warn
62. globals) File "/usr/lib/python2.5/warnings.py" in warn_explicit
102. raise message

Exception Type: Warning at /restaurant/add/ Exception Value: Truncated incorrect DOUBLE value: 'a'

2
You define name in the form but you do not exclude it, and it is defined in the restaurant model. I would have though you don't need to define it again in the Form. - Marcus Whybrow
Yes, I do that to add attributes to the widget. - jul

2 Answers

0
votes

I see you also posted this same question to Django-users. I'll copy the answer I've posted there:

Firstly, it is no use just giving the name of the error. Errors come with tracebacks, for good reason: they allow us to see exactly where the error is occurring, and the context.

Anyway, in your case, there doesn't seem to be any need to use save_m2m. The documentation states:

"Calling save_m2m() is only required if you use save(commit=False)"

In your case, you've already saved the form to get the new_restaurant instance, and you're adding tags to that instance with no problem. The last two calls, to new_restaurant.save() and form.save_m2m(), are unnecessary.

0
votes

You don't need either of the last two "save" calls. Your tags relation will be implicitly saved by virtue of the add(). I'd just drop those from the code.