2015-08-09 4 views
1

Я борется с представлениями класса весь день после того, как начал их вчера. Мой вопрос постоянно получает 'str' object has no attribute 'visible_fields', поэтому 'форма' пункт ниже, не является на самом деле форма:Объект 'str' не имеет атрибута 'visible_fields'; django class based views

template-

<form action="" method="post"> 
    {% csrf_token %} 
    {{form|bootstrap}} 
    <input type="submit" name="submit" value="Add new article"/> 
</form> 

view-

class ArticleCreateView(CreateView): 
    model = Article 
    template_name = 'index/add_article.html' 
    form_class = ArticleForm 

    def post(self, request, *args, **kwargs): 
     article_form = self.get_form() 
     if article_form.is_valid(): 
      article = article_form.save(commit=False) 
      title = article_form.cleaned_data['title'] 
      url  = article_form.cleaned_data['url'] 
      title = process_title(url) 
      article.title = title 
      article.save() 
      return redirect("index:article_list") 
     else: 
      form = ArticleForm() 
      print type(form) 
      print dir(self) 
      return render(request, 'index/add_article.html') 

Худшая часть печати type(form) показывает его есть <class 'index.forms.ArticleForm'>. Я пытаюсь просто перенаправить его в представление списка, если форма сохранена, и воспроизвести форму с ошибкой (у вас уже есть статья с этим URL-адресом), если форма плохая. Я слышал, что классные представления легче работать, и огромные проекты, которые я прочитал, используют их, но они действительно кажутся хуже старых. Я предполагаю, что это потому, что я их не использую хорошо

Каждый пример я видел есть шаблон получать «форму» как-то, как

class RangeCreateView(CreateView): 
    model = Range 
    template_name = 'dashboard/ranges/range_form.html' 
    form_class = RangeForm 

    def get_success_url(self): 
     if 'action' in self.request.POST: 
      return reverse('dashboard:range-products', 
          kwargs={'pk': self.object.id}) 
     else: 
      msg = render_to_string(
       'dashboard/ranges/messages/range_saved.html', 
       {'range': self.object}) 
      messages.success(self.request, msg, extra_tags='safe noicon') 
      return reverse('dashboard:range-list') 

    def get_context_data(self, **kwargs): 
     ctx = super(RangeCreateView, self).get_context_data(**kwargs) 
     ctx['title'] = _("Create range") 
     return ctx 

тогда как магия в range_form.html:

{ % включают в «приборной панели/партиалы/form_fields.html» с формой = форма%}

Мой вопрос здесь мне нужно обработать заголовок формы, с

def process_title(url): 
    def _search_for_title(url): 
     try: 
      r = requests.get(url) 
      content = r.text 
      t = html.document_fromstring(content) 
      return t.find(".//title").text 
     except IOError: 
      return None 

    title = _search_for_title(url) 
    return title or 'None' 

Этот вид разрушает цель класса. Кажется, я должен обрабатывать название, переопределяя «чистый» в самой форме?

В противном случае, как я могу заставить этот вид передать объект формы, отобразить его в шаблоне и просто повторно отобразить шаблон, если форма не прошла?

И как я могу получить доступ к форме в шаблоне?

Спасибо

+0

Как? Выполняя то же, что и примерное представление, вместо того, чтобы вместо этого выполнять «пост», как вы это делаете. –

+0

, поэтому я должен обработать изменение заголовка в чистом виде формы до того, как он достигнет представления? – codyc4321

+0

вот что я сейчас делаю – codyc4321

ответ

5

Вы делаете это, следуя примеру вид, а не перекрывать post вместо этого как вы делаете.

В вашем случае просто отображением и обработкой формы является поведение по умолчанию из CreateView. Поэтому нет необходимости переопределять какие-либо методы вообще. Ваш взгляд должен быть только:

class ArticleCreateView(CreateView): 
    model = Article 
    template_name = 'index/add_article.html' 
    form_class = ArticleForm 
+0

на самом деле м-р. Роземану мне нужно обработать название (когда они отправляют форму). 'title = process_title (url)' будет пытаться захватить элемент заголовка html, если пользователь не вводит заголовок, а мой заполнитель формы сообщает им: «Я попытаюсь захватить заголовок», если они оставят «Заголовок» пустым. Как сделать базовую обработку «заголовка», не нарушая мое мнение, как я сделал выше? – codyc4321

+1

Вы можете переопределить методы 'form_valid' и' form_invalid', или переопределить пост, но вызов метод parent с помощью super. – GwynBleidD

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