2015-05-29 3 views
0

Чтобы обойти проблемы с Taggit, я пытаюсь добавить кавычки вокруг значений в поле тега перед их переносом в модель. Это то, что у меня есть, но это не работает. Что я делаю не так?Django: изменение значений полей до их отправки

class TagField(models.CharField): 

    description = "Simplifies entering tags w/ taggit" 

    def __init__(self, *args, **kwargs): 
     super(TagField, self).__init__(self, *args, **kwargs) 

    # Adds quotes to the value if there are no commas 
    def to_python(self, value): 
     if ',' in value: 
      return value 
     else: 
      return '"' + value + '"' 

class CaseForm(forms.ModelForm): 
    class Meta: 
     model = Case 
     fields = ['title', 'file', 'tags'] 
     labels = { 
      'file': 'Link to File', 
      'tags': 'Categories' 
     } 
     widgets = { 
      'tags': TagField() 
     } 
+0

Был ли мой ответ когда-либо срабатывающим из вас? – metahamza

ответ

0

Вы подклассов models.CharField, вместо этого вы должны создать подкласс forms.CharField, вы указываете для атрибута виджета в форме, но вы пытаетесь создать поле формы подкласса.

+0

Когда я это делаю, я получаю ошибку: «int() аргумент должен быть строкой, байтовым объектом или числом, а не« TagField »» –

0

Причина, по которой это не работает, вы определяете поле пользовательской модели, а затем пытаетесь указать его как виджет в форме. Если вам действительно нужен пользовательский виджет, вам нужно фактически предоставить экземпляр виджета, а не экземпляр поля модели.

Но для того, чтобы получить нужное поведение, вместо этого вам нужно объявить поле на уровне модели в качестве экземпляра вашего настраиваемого класса полей.

Попробуйте что-то вроде -

from django.db import models 

class TagField(models.CharField): 
    description = "Simplifies entering tags w/ taggit" 

    def __init__(self, *args, **kwargs): 
    super(TagField, self).__init__(*args, **kwargs) 

    # Adds quotes to the value if there are no commas 
    def to_python(self, value): 
    if any(x in value for x in (',', '"')): 
     return value 
    else: 
     return "\"%s\"" % value 

class ModelWithTag(models.Model): 
    tag = TagField(max_length = 100) 

Метод to_python также называют Model.clean(), который называется во время проверки формы, поэтому я думаю, что это обеспечит поведение вам нужно.

Обратите внимание, что я также проверяю наличие двойной котировки в вашем состоянии в методе to_python, иначе кавычки будут продолжать «складывать» каждый раз, когда вызывается функция save().

Смежные вопросы