Django save_m2m()和排除字段

时间:2010-03-15 18:02:24

标签: django forms model save

更新:我最终创建了一个新的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'

2 个答案:

答案 0 :(得分:0)

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

首先,仅提供错误的名称是没有用的。错误来了 有追溯,有充分的理由:它们让我们看到确切的位置 错误正在发生,以及上下文。

无论如何,在您的情况下,似乎没有任何需要使用 save_m2m。文档说明:

  

“只有在使用save(commit = False)”

时才需要调用save_m2m()

在您的情况下,您已保存表单以获取new_restaurant 实例,您正在向该实例添加标签而没有任何问题。该 最后两次致电new_restaurant.save()form.save_m2m()是不必要的。

答案 1 :(得分:0)

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