开发者

Django save_m2m() and excluded field

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'


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.


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.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜