1

Я пытаюсь создать некоторые объекты с ОЦК Джанго FormView код для form_class как это:формы не вызывалась

class UrlForm(forms.Form): 
    url = forms.CharField(required=True, 
       help_text=_("This should be an absolute path, excluding the domain name.\ 
          Example: '/events/search/'."), 
       widget=forms.TextInput(attrs={'style':'width:400px;'})) 
    title = forms.CharField(required=True, widget=forms.Textarea()) 
    description = forms.CharField(required=True, widget=forms.Textarea()) 
    keywords = forms.CharField(required=True, widget=forms.Textarea()) 

    def clean(self): 
     cleaned_data = super(UrlForm, self).clean() 
     url = cleaned_data.get('url') 
     try: 
      Url.objects.get(url=url) 
      raise forms.ValidationError("Seo Url already exists.") 
     except: 
      pass 
     return cleaned_data 

и я использовать это представление для визуализации формы:

class CreateSeoByUrl(FormView): 
    template_name = 'create_seo_by_url.html' 
    form_class = UrlForm 

    def get_success_url(self): 
     return reverse('dashboard:index') 

    def post(self, request, *args, **kwargs): 
     url = Url.objects.create(url= request.POST.get('url')) 
     seo = Seo.objects.create(
        title = request.POST.get('title'), 
        description = request.POST.get('description'), 
        keywords = request.POST.get('keywords'), 
        content_object=url) 

     return redirect(self.get_success_url()) 

URL-адрес должен быть уникальным, поэтому я пытаюсь поднять ValidationError, если существует Url с одинаковым значением. Но уловка не входит в чистый метод формы и не в form_valid или form_invalid, это просто sh oots, чтобы отправить метод и пытается создать объекты url и seo. Почему мой метод clean/form_valid/invalid не получает вызов .. я нахожусь на своем конце!

+0

Создание def post (...) для def form_valid (self, form) сделал трюк. –

ответ

4

Ваш почтовый метод неправильный. Вы должны либо использовать form_valid метод как ниже

def form_valid(self, form): 
    url = Url.objects.create(url= form.cleaned_data['url']) 
    seo = Seo.objects.create(
       title = form.cleaned_data['title'], 
       description = form.cleaned_data['description'], 
       keywords = form.cleaned_data['keywords'], 
       content_object=url) 

    return redirect(self.get_success_url()) 

или если вы хотите использовать метод Post использовать его, как показано ниже:

def post(self, request, *args, **kwargs): 
    form = self.form_class(request.POST) 
    if form.is_valid(): 
     url = Url.objects.create(url= form.cleaned_data['url']) 
     seo = Seo.objects.create(
       title = form.cleaned_data['title'], 
       description = form.cleaned_data['description'], 
       keywords = form.cleaned_data['keywords'], 
       content_object=url) 

    return redirect(self.get_success_url()) 

I'vent протестировали код, но он будет работать. Позвольте мне объяснить, почему ваш код не работал. В вашем методе post вы не инициализировали форму с помощью аргументов post. после того, как форма инициализирована, вы можете запустить чистый метод, и он будет увеличивать исключения, если таковые имеются. Кроме того, поскольку вы используете FormView, существует метод form_valid (моя рекомендация - сначала прочитать перед разработкой). Другой совет, поскольку вы используете форму для создания объекта, почему бы не использовать CreateView и ModelForm. :)

1

При вызове чистой вы должны вернуть чистые данные с собой

def clean(self): 
    url = self.cleaned_data.get('url') 
    try: 
     my_url = Url.objects.get(url=url) 
     if my_url: 
      raise forms.ValidationError("Seo Url already exists.") 
    except Url.DoesNotExist: 
     pass 
    return self.cleaned_data 
2

Это не будет работать, потому что вы перекрывая весь post метод в поле зрения. Этот метод post по умолчанию отвечает за проверку валидации по форме и вызов метода form_valid или form_invalid после этого.

В чем смысл использования FormView, если вы не используете форму вообще.

Также: вы sholud ссылаетесь на форму cleaned_data, а не на request.POST. Он будет содержать только полностью очищенные данные.

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