2017-08-10 56 views
0

我有一个分类模型,它有一个外部本身,可以有空值。Django外键空和unqiue togehter,加小写字母

我知道当外键为空时唯一的一起不起作用。此外,我想检查它们是否重复,独一无二的情况下(低,高,组合),父母和孩子不具有相同的名称。

我在网站上发现了一些不完整的解决方案,但不是很好,并没有涵盖我所有的情况。另一件事,我做模型干净,因为我将在管理中有类别,所以没有形式或视图在我的控制下。

现在,我在'name__iexact“上有一个错误,不明白为什么因为'name == self.name'起作用。

"NameError: name '_' is not defined"

self.pk = PK;我检查这是因为在更新的情况下,它会找到我编辑并拖曳ValidationError的当前实例,这是不正确的。

class Category(models.Model): 
    name = models.CharField(max_length=255) 
    parent = models.ForeignKey('self', blank=True, null=True, verbose_name='parent category') 
    description = models.TextField() 

    def __str__(self): 
     return self.name 

    def clean(self): 
     cleaned_data = super().clean() 

     if not self.parent: 
      exists = self.__class__.objects.filter(~Q(pk=self.pk), name__iexact=self.name).exists() 
      if exists: 
       raise ValidationError(_('Duplicate Category Name with No Parent'), code='duplicate_no_parent') 
     if self.name.lower() == self.parent.name.lower(): 
      raise ValidationError(_('Category Name the same as Parent Category Name'), code='duplicate_as_parent') 

     return cleaned_data 

误差name__iexact:

Exception Type:  NameError 
Exception Value:  

name '_' is not defined 

File "D:\DevEnv\PythonEnv\Django\lib\site-packages\django\core\handlers\exception.py", line 41, in inner 
    response = get_response(request) 
    File "D:\DevEnv\PythonEnv\Django\lib\site-packages\django\core\handlers\base.py", line 187, in _get_response 
    response = self.process_exception_by_middleware(e, request) 
    File "D:\DevEnv\PythonEnv\Django\lib\site-packages\django\core\handlers\base.py", line 185, in _get_response 
    response = wrapped_callback(request, *callback_args, **callback_kwargs) 
    File "D:\DevEnv\PythonEnv\Django\lib\site-packages\django\contrib\admin\options.py", line 551, in wrapper 
    return self.admin_site.admin_view(view)(*args, **kwargs) 
    File "D:\DevEnv\PythonEnv\Django\lib\site-packages\django\utils\decorators.py", line 149, in _wrapped_view 
    response = view_func(request, *args, **kwargs) 
    File "D:\DevEnv\PythonEnv\Django\lib\site-packages\django\views\decorators\cache.py", line 57, in _wrapped_view_func 
    response = view_func(request, *args, **kwargs) 
    File "D:\DevEnv\PythonEnv\Django\lib\site-packages\django\contrib\admin\sites.py", line 224, in inner 
    return view(request, *args, **kwargs) 
    File "D:\DevEnv\PythonEnv\Django\lib\site-packages\django\contrib\admin\options.py", line 1508, in add_view 
    return self.changeform_view(request, None, form_url, extra_context) 
    File "D:\DevEnv\PythonEnv\Django\lib\site-packages\django\utils\decorators.py", line 67, in _wrapper 
    return bound_func(*args, **kwargs) 
    File "D:\DevEnv\PythonEnv\Django\lib\site-packages\django\utils\decorators.py", line 149, in _wrapped_view 
    response = view_func(request, *args, **kwargs) 
    File "D:\DevEnv\PythonEnv\Django\lib\site-packages\django\utils\decorators.py", line 63, in bound_func 
    return func.__get__(self, type(self))(*args2, **kwargs2) 
    File "D:\DevEnv\PythonEnv\Django\lib\site-packages\django\contrib\admin\options.py", line 1408, in changeform_view 
    return self._changeform_view(request, object_id, form_url, extra_context) 
    File "D:\DevEnv\PythonEnv\Django\lib\site-packages\django\contrib\admin\options.py", line 1440, in _changeform_view 
    if form.is_valid(): 
    File "D:\DevEnv\PythonEnv\Django\lib\site-packages\django\forms\forms.py", line 183, in is_valid 
    return self.is_bound and not self.errors 
    File "D:\DevEnv\PythonEnv\Django\lib\site-packages\django\forms\forms.py", line 175, in errors 
    self.full_clean() 
    File "D:\DevEnv\PythonEnv\Django\lib\site-packages\django\forms\forms.py", line 386, in full_clean 
    self._post_clean() 
    File "D:\DevEnv\PythonEnv\Django\lib\site-packages\django\forms\models.py", line 408, in _post_clean 
    self.instance.full_clean(exclude=exclude, validate_unique=False) 
    File "D:\DevEnv\PythonEnv\Django\lib\site-packages\django\db\models\base.py", line 1234, in full_clean 
    self.clean() 
    File "D:\DevProj\Learn\Django\ph_work\categories\models.py", line 21, in clean 
    raise ValidationError(_('Duplicate Category Name with No Parent'), code='duplicate_no_parent') 
NameError: name '_' is not defined 

回答

1

试试吧,把完整的错误堆栈

exists = self.__class__.objects.exclude(pk=self.pk).filter(name__iexact=self.name).exists() 
+0

: \ forms.py “线路183,在is_valid 回报self.is_bound而不是self.errors \形式\ forms.py”,线路175,在错误 self.full_clean( )forms \ forms.py“,第386行,在full_clean中 self._post_clean() \ forms \ models.py”,第408行,在_post_clean中 self.instance.full_clean(exclude = ()复制代码清除 中的第20行self.clean() \ categories \ models.py“,第20行。没有父'的类别名称'),代码='duplicate_no_parent') NameError:名称'_'未定义 – user3541631

+0

请将其作为代码 –

+0

添加进来'从django.utils.translation import ugettext as _' –

0

如果是相同的字符串值检查我建议使用 “就是” 运营商:

if self.name.lower() is self.parent.lower() 

这样你正在测试以查看它们是否共享相同的内存地址,这很好,因为Python存储了在一个内存a中具有相同值的字符串ddress。

+0

居然是:self.name.lower()== self.parent.name.lower(),并使用 “是”,而不是==会如果form.is_valid()失败 – user3541631