2010-03-15 119 views
0

更新:我结束了创建一个新的forms.Form代替使用的ModelFormDjango的save_m2m()和排除字段

在的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.响应=回调(请求, * 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,cleaned_dat一个[f.name])文件“/var/lib/python-support/python2.5/django/db/models/fields/
related.py”in save_form_data
967. setattr(instance,self.attname,数据)文件 “/var/lib/python-support/python2.5/django/db/models/fields/
related.py” 在设置
627 manager.add(*值)文件“/无功/lib/python-support/python2.5/django/db/models/fields/
related.py “中添加
430 self._add_items(self.source_col_name,self.target_col_name,* OBJ文件)文件 ”/ 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“in
执行
19.返回self.cursor.execute(SQL,则params)文件 “/var/lib/python-support/python2.5/django/db/backends/mysql/
base.py” 在执行
84 。return self.cursor.execute(query,args)执行中的文件“/var/lib/python-support/python2.5/MySQLdb/cursors.py”
168. if not 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 。全局)文件 “/usr/lib/python2.5/warnings.py” 在warn_explicit
102加薪消息

异常类型:AT /餐厅警告/添加/异常值: 截断不正确DOUBLE值:' a'

+0

您可以在表单中定义'name',但不排除它,它在餐厅模型中定义。我会尽管你不需要在表单中再次定义它。 – 2010-03-15 18:22:45

+0

是的,我这样做是为了给widget添加属性。 – jul 2010-03-15 19:08:02

回答

0

我看到你也发布了同样的问题给Django用户,我会复制我在那里发布的答案:

首先,仅给出错误的名称是没有用的。带有回溯的错误来自 ,理由很充分:它们允许我们准确查看错误发生的位置以及上下文。

无论如何,在你的情况下,似乎没有任何需要使用 save_m2m。该文件指出:

“调用save_m2m()仅当您使用保存所需的(提交= FALSE)”

在你的情况,你已经保存的形式来获取new_restaurant 实例,并且您正在向该实例添加标签而没有任何问题。最后两个呼叫 ,至new_restaurant.save()form.save_m2m(),都是不必要的。

+0

我实际上需要form.save_m2m(),因为我的餐厅模型中有另一个m2m字段(我更新了代码)。我已经添加了回溯。 – jul 2010-03-15 19:18:19

0

您不需要最后两次“保存”调用。您的标签关系将通过add()隐式保存。我只是从代码中删除这些代码。

+0

我实际上需要form.save_m2m(),因为我的餐厅模型中有另一个m2m字段(我更新了代码)。 – jul 2010-03-15 19:17:46