2016-02-06 2 views
0

Я пытаюсь создать страницу со следующей планировкой:Как достичь 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 %} 

Там есть несколько проблем (вопросов) У меня с этим.

  1. OwnerForm (начальный = { 'поле1':. Контекст [ 'объект'] ID}) => не предварительный выбор владельца

  2. контекста [ 'owned_computers_list'] = Computer.objects.all() [: 10] => это становится все компьютеры - Я хочу, чтобы фильтровать их владельцем, но не имеют доступа к владельцу в этом методе

Я уверен, что вся моя архитектура неправильно. Я не должен использовать DetailsView, так как я не представляю подробностей для модели, к которой я привязал представление (ComputerOwnerDetailView -> Computer). Но я не знаю, как достичь требуемой функциональности.

Прямо сейчас, когда я отправляю форму, она возвращает меня к тому же URL-адресу, но с POST, однако я не могу обрабатывать POST (или, по крайней мере, не найти способ) в текущей настройке, чтобы я мог видеть новый идентификатор Владельца, который пользователь выбрал с выпадающим списком и перенаправляет его владельцу/NEW_ID /, чтобы перечислены компьютеры, связанные с этим новым владельцем.

Можете ли вы мне помочь.

Спасибо

ответ

0

Добавьте следующую строку в ваш взгляд:

from django.core.urlresolvers import reverse 

class ComputerOwnerDetailView(generic.FormView): 

... 

    def form_valid(self,form): 
     owner = get_object_or_404(Owner,pk=form.cleaned_data['owner'] 
     return HttpResponseRedirect(reverse('owner_details',owner.id)) 

Если вы хотите пользовательской страницы вместо 404:

from django.core.exceptions import ObjectDoesNotExist 

def form_valid(self,form): 
    try: 
     owner = Owner(pk=form.cleaned_data['owner'] 
     ulr = reverse('owner_details',owner.id) 
    except ObjectDoesNotExist: 
     url = reverse("another-view") 
    return HttpResponseRedirect(url) 
+0

Это не работает. метод 'form_valid' никогда не вызван – mp3por

+0

Вы правы, извините, это должно быть generic.FormView для запуска form_valid. Но теперь вам нужно получить файл computer_owner_detail в контексте и не полагаться на CBV: context ['computer_owner_detail'] = ... (Я бы не рекомендовал возиться с подклассированием как DetailsView, так и FormView) –

+1

Эй, я пробовал новый способ, но он все еще не работает. Я изучаю другие возможности и буду публиковать, если найду рабочий. – mp3por

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