【问题标题】:django-selectable forms validation and model forms filter querysetdjango 可选表单验证和模型表单过滤器查询集
【发布时间】:2016-05-08 03:24:00
【问题描述】:

我使用 django-selectable 进行自动编译,我需要模型表单验证

所以我在 forms.py 中进行了验证

def clean(self):
    cl_title = Color.objects.values_list('title',flat=True)
    if self.cleaned_data.get('color') != cl_title:
        raise forms.ValidationError('this color is not found in the database')
    return self.cleaned_data

我出错了

 Request Method:    POST
 Exception Type:    ValueError
 Exception Value: Cannot assign "<Color: awffawfwa>": "Color" instance isn't saved in the database.

它不起作用 详情见下文

models.py

class Color(models.Model):
    title = models.CharField('color title', max_length=100)
    user = models.CharField(User)
    description = models.TextField('description')

    def __str__(self):
        return self.title

class Item(models.Model):
    user = models.ForeignKey(User)
    color = models.ForeignKey(Color)
    # ... some logic

    def __str__(self):
        return self.color.title

lookups.py

from selectable.base import ModelLookup
from selectable.registry import registry
from .models import Color

class ColorLookup(ModelLookup):
    model = Book
    search_fields = ('title__icontains',)

registry.register(ColorLookup)

forms.py

from django import forms
from .models import Color
import selectable.forms as selectable
from .lookups import BookLookup

class ItemSelectForm(forms.ModelForm):
    color = selectable.AutoCompleteSelectField(
    lookup_class = ColorLookup,
    allow_new = True,
    label= 'select',
    required = True,
)

class Meta:
    model = Color
    fields = ('color',)

def clean(self):
    cl_title = Color.objects.values_list('title',flat=True)
    if self.cleaned_data.get('color') != cl_title:
        raise forms.ValidationError('this color is not found in the database')
    return self.cleaned_data

但它不起作用,你能帮我吗,如何纠正这个错误? 在此先感谢;)

【问题讨论】:

    标签: django python-2.7 django-models django-forms


    【解决方案1】:

    values_list 将返回一个颜色列表,因此您的单个值永远不会等于该数组,您需要检查您的颜色不在此列表中(如果它确实是您需要的列表..)

    您还可以将此逻辑分离为单独的颜色清理方法。

    def clean_color(self):
        color = self.cleaned_data.get('color')
        cl_title = Color.objects.values_list('title',flat=True)
        if color not in cl_title:
            raise forms.ValidationError('this color is not found in the database')
        return color  
    

    或者,可能更喜欢,你可以这样做

    if not Color.objects.filter(title=color).exists():
    

    这是一个更高效的查询,因为它不会从数据库返回任何不需要的值。

    【讨论】:

      猜你喜欢
      • 2012-05-02
      • 2012-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-22
      • 1970-01-01
      相关资源
      最近更新 更多