【问题标题】:Django save_m2m() and excluded fieldDjango save_m2m() 和排除字段
【发布时间】:2011-01-27 19:20:06
【问题描述】:

更新:我最终创建了一个新的 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. 响应 = 回调(请求,*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”中
保存_m2m
75. f.save_form_data(instance,cleaned_data[f.name]) 文件“/var/lib/python-support/python2.5/django/db/models/fields/
相关.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/
相关的.py”在添加
430. self._add_items(self.source_col_name, self.target_col_name, *objs) 文件 "/var/lib/python-support/python2.5/django/db/models/fields/
_add_items
中的related.py” 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. return self.cursor.execute(query, args) File "/var/lib/python-support/python2.5/MySQLdb/cursors.py" 在执行
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) 文件 "/usr/lib/python2.5/warnings.py" in warn
62. globals) 文件 "/usr/lib/python2.5/warnings.py" 在 warn_explicit
102. 提出消息

异常类型:/restaurant/add/ 处的警告异常值: 截断不正确的 DOUBLE 值:'a'

【问题讨论】:

  • 您在表单中定义name但不排除它,它是在餐厅模型中定义的。尽管您不需要在表单中再次定义它,但我会这样做。
  • 是的,我这样做是为了向小部件添加属性。

标签: django forms model save


【解决方案1】:

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

【讨论】:

  • 我实际上需要 form.save_m2m() 因为我的餐厅模型中有另一个 m2m 字段(我更新了代码)。
【解决方案2】:

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

首先,只给出错误的名称是没有用的。错误来了 有回溯,有充分的理由:它们让我们能够准确地看到在哪里 错误正在发生,以及上下文。

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

"只有在使用 save(commit=False) 时才需要调用 save_m2m()"

在您的情况下,您已经保存了表单以获取 new_restaurant 实例,并且您可以毫无问题地向该实例添加标签。这 最后两次调用new_restaurant.save()form.save_m2m() 是不必要的。

【讨论】:

  • 我实际上需要 form.save_m2m() 因为我的餐厅模型中有另一个 m2m 字段(我更新了代码)。我已经添加了回溯。
猜你喜欢
  • 2010-12-29
  • 2012-06-14
  • 2011-08-08
  • 1970-01-01
  • 1970-01-01
  • 2013-12-03
  • 1970-01-01
  • 2011-10-26
  • 2013-08-11
相关资源
最近更新 更多