Как проверить форму django только при добавлении без редактирования - PullRequest
1 голос
/ 29 октября 2010

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

class PageForm(forms.Form):
    name = forms.CharField(max_length=100,widget=forms.TextInput(attrs={'class':'textInput'}))
    description = forms.CharField(max_length=300, required=False,widget=forms.TextInput(attrs={'class':'textInput'}))
    body = forms.CharField(widget=forms.Textarea)
    template = forms.CharField(max_length=30,widget=forms.TextInput(attrs={'class':'textInput'}))
    navbar = forms.BooleanField(required=False, widget=forms.Select(choices=(('True','True'),
                                                                             ('False', 'False'))))
    publish = forms.BooleanField(widget=forms.Select(choices=(('Published','Publish Now'),
                                                              ('Private','Private'),
                                                              ('Draft','Draft'))))

    def save(self, page=None, commit=True):
        data = self.cleaned_data
        if not page: 
            page = models.Page(key_name=data['name'].replace(' ','-'))
        page.name = data['name']
        page.description = data['description']
        page.body = data['body']
        page.template = data['template']
        page.publish = data['publish']
        if commit: page.put()
        return page


    # prevent the same page 's name
    def clean_name(self):
        name = self.cleaned_data['name']
        query = models.Page.all(keys_only=True)
        query.filter('name = ', name)

        page = query.get()

        if page:
            raise forms.ValidationError('Page name "%s" was already used before' % name)

        return name

Целью этой проверки имени является предотвращение записей с одинаковым именем. Но я обнаружил, что это также подтверждает при редактировании, поэтому мы не можем редактировать записи, так как там будет сказано «записи с таким именем уже существуют».

На самом деле для редактирования, параметр страницы в функции сохранения не будет нулевым, а будет прежней записью, а при сохранении нового будет нулевым. Но как мы читаем этот параметр в функции clean_name, чтобы мы могли теперь редактировать или создавать его?

Большое спасибо!

Ответы [ 3 ]

2 голосов
/ 29 октября 2010

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

Если это так, то вы, вероятно, редактируете существующий объект .. верно?

Пример: Если вы редактируете объект с помощью формы, вы создаете объект формы, очень похожий на этот:

form = MyForm(instance = myobject)

Затем в ваших методах класса формы вы можете проверить, сохранила ли форма экземпляр, как описано здесь: Проверка наличия экземпляра Django ModelForm

0 голосов
/ 29 октября 2010

Извините, я не могу прокомментировать ниже ваше сообщение, ребята, не знаю почему.

@ sunn0: я не использовал модели django, потому что разверните приложение в appengine, поэтому используйте модель appengine.

@ Zayatzz: Не могли бы вы показать небольшой код, как это сделать?Так как мы добавляем или редактируем, мы всегда привязываем форму к request.POST перед проверкой, поэтому не знаю, как провести различие.

@ Ashok: я сделал обходной путь, основываясь на вашем предложении.Поскольку ранее я не передавал pk в форму, а вместо этого передавал объект prev в качестве param, я не мог исключить его с помощью pk.Итак, я изменяю код и добавляю дополнительный ключ как pk (если создать, пусть ключ пустой, но если редактировать ключ заполнения с помощью pk), и просто проверяю, если условие, если поле ключа не пустое, то это означает, что мы редактируем.Не уверен, что это лучшая практика, но она все равно работает.

0 голосов
/ 29 октября 2010

в вашей функции clean_name исключает текущий объект из набора запросов

query.filter('name = ', name).exclude(pk=self.pk)

или измените условие if, чтобы проверить, что страница и текущий объект не совпадают.

...