django-selectable 表单验证和模型表单过滤器查询集
django-selectable forms validation and model forms filter queryset
我使用 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
但是它不起作用,你能帮我吗,如何更正这个错误?
提前致谢 ;)
values_list
将 return 一个颜色列表,所以你的单个值永远不会等于这个数组,你需要检查你的颜色不在这个列表中(如果它真的是一个列表你需要..)
您也可以将此逻辑分离到一个单独的颜色清理方法中。
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():
这是一个更高效的查询,因为它return 数据库中没有任何不需要的值。
我使用 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
但是它不起作用,你能帮我吗,如何更正这个错误? 提前致谢 ;)
values_list
将 return 一个颜色列表,所以你的单个值永远不会等于这个数组,你需要检查你的颜色不在这个列表中(如果它真的是一个列表你需要..)
您也可以将此逻辑分离到一个单独的颜色清理方法中。
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():
这是一个更高效的查询,因为它return 数据库中没有任何不需要的值。