Я пытаюсь создать страницу со следующей планировкой:Как достичь FormView и ListView на одной странице [Джанго 1.8]
|----------------------------------------------------------------
| |----------------------------------|
| | See details: Owner (dropdown) | -> Form
| |----------------------------------|
|
| |----------------------------------|
| | Computer brand: DELL | -> List of computers
| | member_field1 |
| | member_field2 |
| | ------------------------------- |
| | Computer brand: ASUS v | -> first computer should have
| | ------------------------------- | all of his details visible
| | Computer brand: TAMAGOCHI v | while the next ones should
| | | be collapsed
Моей функциональность, когда пользователь выбирает владелец из выпадающего меню будет перенаправлена to/Owner/ID/и получить информацию обо всех связанных с ним компьютерах ниже.
Я также хотел бы иметь поле «Создать новый владелец» по умолчанию в раскрывающемся списке в качестве первого возможного варианта и посмотреть ниже, чтобы создать форму владельца.
Я много часов боролся с этим, пытаясь понять все Представления, общие представления и все.
Вещи, которые у меня есть (это не те реальные примеры, так что код даже не компилируется, но он показывает общие вещи, которые я имею в мое приложение прямо сейчас):
# models
class Computer(models.Model):
brand = models.CharField(max_length=10)
member_field1
member_field2
owner = models.ForeignKey('Owner')
class Owner(models.Model):
name = models.CharField(max_length=10)
# forms
class OwnerForm(forms.Form):
owner = forms.ModelChoiceField(querySet=Owner.objects.all())
# views
class ComputerOwnerDetailView(generic.DetailView):
model = Computer
template_name = 'computer_owner_detail.html'
def get_context_data(self, **kwargs):
context = super.get_context_data
context['owner_chooser_form'] = OwnerForm(initial = {'field1':context['object'].id})
context['owned_computers_list'] = Computer.objects.all()[:10]
return context
# urls
url(r'^owner/(?P<pk>[0-9]+)/$', views.ComputerOwnerDetailView.as_view(), name='owner_detail'),
# template
{% extends 'android/index.html' %}
{% block where_it_has_to_go_in_base %}
<form method="POST" class="post-form">{% csrf_token %}
{{ owner_chooser_form.as_p }}
<button type="submit" class="save btn btn-default">Save</button
</form>
{% if computer_owner_detail %}
<ul>
{% for computer in computer_owner_detail %}
<li>{{ computer.brand }}</li>
{% endfor %}
</ul>
{% else %}
<p> No computer Defined Yet </p>
{% endif %}
{% endblock %}
Там есть несколько проблем (вопросов) У меня с этим.
OwnerForm (начальный = { 'поле1':. Контекст [ 'объект'] ID}) => не предварительный выбор владельца
контекста [ 'owned_computers_list'] = Computer.objects.all() [: 10] => это становится все компьютеры - Я хочу, чтобы фильтровать их владельцем, но не имеют доступа к владельцу в этом методе
Я уверен, что вся моя архитектура неправильно. Я не должен использовать DetailsView, так как я не представляю подробностей для модели, к которой я привязал представление (ComputerOwnerDetailView -> Computer). Но я не знаю, как достичь требуемой функциональности.
Прямо сейчас, когда я отправляю форму, она возвращает меня к тому же URL-адресу, но с POST, однако я не могу обрабатывать POST (или, по крайней мере, не найти способ) в текущей настройке, чтобы я мог видеть новый идентификатор Владельца, который пользователь выбрал с выпадающим списком и перенаправляет его владельцу/NEW_ID /, чтобы перечислены компьютеры, связанные с этим новым владельцем.
Можете ли вы мне помочь.
Спасибо
Это не работает. метод 'form_valid' никогда не вызван – mp3por
Вы правы, извините, это должно быть generic.FormView для запуска form_valid. Но теперь вам нужно получить файл computer_owner_detail в контексте и не полагаться на CBV: context ['computer_owner_detail'] = ... (Я бы не рекомендовал возиться с подклассированием как DetailsView, так и FormView) –
Эй, я пробовал новый способ, но он все еще не работает. Я изучаю другие возможности и буду публиковать, если найду рабочий. – mp3por