2013-07-30 3 views
0

Je suis nouveau pour les développeurs de framework django, et j'ai lu beaucoup de documentation sur Class-Based View et Forms. Maintenant, je veux créer une seule page (à des fins de test) qui contient une liste de voitures et un formulaire, à la page du bas, pour créer une nouvelle voiture.ListView avec formulaire dans Django

ceci est mon views.py

class IndexView(ListView): 
template_name = "index.html" 
context_object_name = "cars" 

def get_context_data(self, **kwargs): 
    context = super(IndexView, self).get_context_data(**kwargs) 
    context["form"] = CarForm 
    return context 

def get_queryset(self): 
    self.brand = self.kwargs.pop("brand","") 
    if self.brand != "": 
     return Car.objects.filter(brand__iexact = self.brand) 
    else: 
     return Car.objects.all() 

def post(self, request): 
    newCar = CarForm(request.POST) 
    if newCar.is_valid(): 
     newCar.save() 
     return HttpResponseRedirect("") 
    else: 
     return render(request, "index.html", {"form": newCar}) 

class CarForm(ModelForm): 
class Meta: 
    model = Car 
    delete = True 

et c'est une photo avec ce que je veux créer.

image

Mes questions sont les suivantes:

1) ceci est un "Best-Pratice" à cette fin? 2) Les {{car.name.errors}} de mon modèle sont toujours vides (aucune erreur de validation n'apparaît).

Merci! ... et désolé pour mon anglais.

Répondre

1

Vous pourriez faire l'inverse. Créez un FormView et mettez la liste des voitures en contexte. De cette façon, la manipulation des formulaires devient plus facile. Comme ceci -

class CarForm(ModelForm): 
    class Meta: 
     model = Car 
     delete = True 

class IndexView(FormView): 
    template_name = "index.html" 
    form_class = CarForm 

    def get_context_data(self, **kwargs): 
     context = super(IndexView, self).get_context_data(**kwargs) 
     # Pass the list of cars in context so that you can access it in template 
     context["cars"] = self.get_queryset() 
     return context 

    def get_queryset(self): 
     self.brand = self.kwargs.pop("brand","") 
     if self.brand != "": 
      return Car.objects.filter(brand__iexact = self.brand) 
     else: 
      return Car.objects.all() 

    def form_valid(self, form): 
     # Do what you'd do if form is valid 
     return super(IndexView, self).form_valid(form) 
Questions connexes