Я борется с представлениями класса весь день после того, как начал их вчера. Мой вопрос постоянно получает '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'
Этот вид разрушает цель класса. Кажется, я должен обрабатывать название, переопределяя «чистый» в самой форме?
В противном случае, как я могу заставить этот вид передать объект формы, отобразить его в шаблоне и просто повторно отобразить шаблон, если форма не прошла?
И как я могу получить доступ к форме в шаблоне?
Спасибо
Как? Выполняя то же, что и примерное представление, вместо того, чтобы вместо этого выполнять «пост», как вы это делаете. –
, поэтому я должен обработать изменение заголовка в чистом виде формы до того, как он достигнет представления? – codyc4321
вот что я сейчас делаю – codyc4321