更新:我最终创建了一个新的forms.Form,而不是使用ModelForm
在ModelForm中,我通过排除字段并添加新字段来替换字段 具有相同的名称,如下面AddRestaurantForm中所示。保存时 下面显示代码的表单,我在form.save_m2m()中收到错误 (“截断不正确的DOUBLE值”),这似乎是由于 函数尝试保存标记字段,但它被排除。
save_m2m()函数是否应该保存排除的字段?
我的代码有什么问题吗?
感谢
七月
(...)
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')
追溯:
文件“/var/lib/python-support/python2.5/django/core/handlers/base.py” 在get_response中 92. response = callback(request,* callback_args,
** callback_kwargs)addRestaurant中的文件“/home/jul/atable/../atable/resto/views.py”
498. form.save_m2m()文件“/var/lib/python-support/python2.5/django/forms/models.py”在
中 save_m2m
75. f.save_form_data(instance,cleaning_data [f.name])文件“/var/lib/python-support/python2.5/django/db/models/fields/
related.py“在save_form_data中 967. setattr(instance,self.attname,data)文件“/var/lib/python-support/python2.5/django/db/models/fields/
related.py“在设置
627. manager.add(* value)文件“/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)文件 “/var/lib/python-support/python2.5/django/db/models/fields/
related.py“in _add_items
497. [self._pk_val] + list(new_ids))文件“/var/lib/python-support/python2.5/django/db/backends/util.py”在
执行
19.返回self.cursor.execute(sql,params)文件“/var/lib/python-support/python2.5/django/db/backends/mysql/
base.py“执行中 84.返回self.cursor.execute(query,args)执行中的文件“/var/lib/python-support/python2.5/MySQLdb/cursors.py” 168.如果不是self._defer_warnings:self._warning_check()文件“/var/lib/python-support/python2.5/MySQLdb/cursors.py”在
中 _warning_check
82.警告(w [-1],self.Warning,3)文件“/usr/lib/python2.5/warnings.py”警告
62. globals)warn_explicit中的文件“/usr/lib/python2.5/warnings.py”
102.提出信息异常类型:/ restaurant / add / Exception值警告: 截断不正确的DOUBLE值:'a'
答案 0 :(得分:0)
我看到你也向Django用户发布了同样的问题。我会复制我在那里发布的答案:
首先,仅提供错误的名称是没有用的。错误来了 有追溯,有充分的理由:它们让我们看到确切的位置 错误正在发生,以及上下文。
无论如何,在您的情况下,似乎没有任何需要使用
save_m2m
。文档说明:
“只有在使用save(commit = False)”
时才需要调用save_m2m()
在您的情况下,您已保存表单以获取new_restaurant
实例,您正在向该实例添加标签而没有任何问题。该
最后两次致电new_restaurant.save()
和form.save_m2m()
是不必要的。
答案 1 :(得分:0)
您不需要最后两次“保存”调用。您的标记关系将通过add()隐式保存。我只是从代码中删除它们。