Ищу полный пример crud представлений на основе классов, включая шаблон.
-
13-11-2019 - |
Вопрос
Документация Django 1.3 по представлениям на основе классов выглядит как поиск сокровищ.Как написать класс достаточно ясно...но какой код шаблона соответствует каждому универсальному классу?Кто-нибудь предоставит полный пример супа с орехами?Вот что у меня есть на данный момент:
urls.py
(r'^brand_create2$', BrandCreate.as_view()),
view.py
from django.views.generic import CreateView
@login_required
class BrandCreate(CreateView):
template_name = 'generic_form_popup.html'
context_object_name = "brand_thingie"
#queryset = models.Brand.objects.all()
success_url = '/'
generic_form_popup.html
????
В данном случае я размышляю, стоит ли изучать новый стиль, учитывая, что старый стиль все еще работает:
urls.py
url(r'^brand_create1$', 'coat.views.brand_create'),
view.py
class formBrand(forms.ModelForm):
class Meta:
model = models.Brand
exclude = ('')
@login_required
def brand_create(request):
form = formBrand
if request.method == 'POST':
form = formBrand(request.POST)
if form.is_valid():
form.save()
return HttpResponseRedirect('/')
passed = dict(
form=form,
MEDIA_URL = settings.MEDIA_URL,
STATIC_URL = settings.STATIC_URL)
return render_to_response('generic_form_popup.html',
passed, context_instance=RequestContext(request))
generic_form_popup.html
{% extends 'head-plain.html' %}
{% block title %}{% endblock %}
{% block headstuff %}{% endblock %}
{% block content %}
<form action="{{ action }}" method="post">
{% csrf_token %}{{ form.as_p }}
<input type="submit" value="Submit" /> </form>
{% endblock %}
Решение
СоздатьView наследует от МодельФормаMixin, которые в свою очередь наследует от ФормаМиксин и SingleObjectMixin.
SingleObjectMixin предоставляет переменную контекста шаблона объекта, которая, вероятно, бесполезна в случае CreateView:
объект:Объект, отображаемый в этом представлении.Если указано context_object_name, эта переменная также будет установлена в контексте с тем же значением, что и объект.
Но ФормаМиксин предоставляет переменную контекста формы:
форма:Экземпляр формы, созданный для представления.
Таким образом, вы можете обратитесь к документации, чтобы отобразить форму с шаблоном:
<form action="/contact/" method="post">{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Submit" />
</form>
Это значит, что тот самый шаблон, который вы выложили, должен почти работать с представлением на основе классов:
{% extends 'head-plain.html' %}
{% block title %}{% endblock %}
{% block headstuff %}{% endblock %}
{% block content %}
<form action="" method="post">
{% csrf_token %}{{ form.as_p }}
<input type="submit" value="Submit" /> </form>
{% endblock %}
Я удалил {{ action }}
потому что это не часть контекста, ни в представлении старого стиля, ни в представлении на основе классов, поэтому это не имеет никакого смысла.Ты должен знать что если action="" то браузер отправит текущий URL-адрес.Вы можете принудительно выполнить действие по текущему URL-адресу с помощью action="{{ request.path }}" или указать другой URL-адрес с помощью тег шаблона URL.
Предположим, применим передовую практику именование шаблонов URL, путем изменения:
(r'^brand_create2$', BrandCreate.as_view()),
к:
(r'^brand_create2$', BrandCreate.as_view(), name='band_create'),
Затем вы можете использовать: action="{% url band_create %}"
.
Вы также можете настроить дальше:
<form action="/contact/" method="post">
{% csrf_token %}
{{ form.non_field_errors }}
<div class="fieldWrapper">
{{ form.subject.errors }}
<label for="id_subject">Email subject:</label>
{{ form.subject }}
</div>
<div class="fieldWrapper">
{{ form.message.errors }}
<label for="id_message">Your message:</label>
{{ form.message }}
</div>
<div class="fieldWrapper">
{{ form.sender.errors }}
<label for="id_sender">Your email address:</label>
{{ form.sender }}
</div>
<div class="fieldWrapper">
{{ form.cc_myself.errors }}
<label for="id_cc_myself">CC yourself?</label>
{{ form.cc_myself }}
</div>
<p><input type="submit" value="Send message" /></p>
</form>
Конечно, доступные в форме поля зависят от вашей модели.