2015-06-17 2 views
0

У меня есть модель, которая содержит поле целогоДжанго Форма выхода/Проверка ошибок вопрос

class myModel(models.Model): 
    number = models.IntegerField() 

Всякий раз, когда я показываю или входные данные для этой модели я хочу сделать это в восьмеричном. Когда я заполнить мою форму редактирования я делаю это:

number = oct(numberObject.number).replace('Oo','') 

Когда я иду в форме редактирования это prepopulates именно то, что я хочу, но когда я пытаюсь сделать проверку ошибок после отправки формы, чтобы избежать этого числа происходит в два раза Я получаю проблему, потому что число находится в self.changed_data, и поэтому я получаю ошибку, что это число уже существует (в основном это находит себя и говорит, что это дубликат)

Я не могу придумать способ фигурировать я пытаюсь изменить номер на тот, который уже существует, или если я просто отправлю номер без его изменения.

Мой код формы/проверки:

class NumberForm(ModelForm): 
    number = forms.CharField(max_length = 10) 

    def clean_number(self): 
     """Ensures the new Number is unique 
     """ 
     enteredNumber = self.cleaned_data['number'] 

     changedFields = self.changed_data 
     if number.objects.filter(number__exact = int(enteredNumber,8)): 
      if 'number' in changedFields: 
       raise forms.ValidationError("Error") 
     return int(enteredNumber,8) 

    class Meta: 
     model = Number 
     fields = '__all__' 
+0

Я также попытался удалить .replace ('Oo', ''), но это не помогло. – user2788328

+0

Можете ли вы указать форму и код подтверждения? –

+0

Добавлен код формы/проверки – user2788328

ответ

1

Вы можете редактировать существующий объект, правильно? я бы просто исключить его из набора результатов:

def clean_number(self): 
    """Ensures the new Number is unique """ 
    enteredNumber = int(self.cleaned_data['number'], 8) 

    queryset = Number.objects.filter(number=enteredNumber) 
    if self.instance is not None and self.instance.pk is not None: 
     queryset = queryset.exclude(pk=self.instance.pk) 

    if queryset.exists(): 
     raise forms.ValidationError("Error") 
    return enteredNumber 

Используя метод .exists() избегает загрузки объекта из базы данных, должен существовать один.

Кстати, эта форма не гарантирует, что вы не можете создавать дубликаты. Два потока могут одновременно запускать код проверки, принимать одно и то же значение, а затем перейти к сохранению соответствующего объекта с этим значением. Если вы хотите быть уверены, что у вас нет дубликатов, вы должны сделать это на уровне базы данных (передав unique=True в поле на модели).

+0

Не могли бы вы дать мне краткое объяснение self.instance. Я не совсем уверен, что это делает. – user2788328

+1

Это объект, который редактируется (или либо None, либо пустой экземпляр, если вы создаете новый объект). Это дается форме, когда она подкрепляется взглядом. – spectras

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