Ищу полный пример crud представлений на основе классов, включая шаблон.

StackOverflow https://stackoverflow.com/questions/9461323

Вопрос

Документация 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>

Конечно, доступные в форме поля зависят от вашей модели.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top