2016-11-04 91 views
0

有沒有辦法通過查詢集字段集合(顯示在views.py中)?我的目標是填充選定的HTML元素只有活動成員。或者有沒有其他方式或最佳做法來解決這個問題?Django - 如何使用基於類的UpdateView將查詢集傳遞給模板?

views.py:

class Orders_update(UpdateView): 
    model = Order 
    active_members = Member.objects.all().filter(active=True) 
    fields = ['order_text', 'customer', 'active_members'] 
    template_name = "orders/orders_update.html" 
    success_url = '../../../orders' 

orders_update.html:

{% extends "base.html" %} 
{% load widget_tweaks %} 
{% block content %} 
<h1>Order - Update</h1> 
<form class="form-group" style="width:200px" action="" method="post">{% csrf_token %} 
    <div class="form-group"> 
     <div class="form-group"> 
     {{ form.order_text|add_class:"form-control" }} 
     {{ form.customer|add_class:"form-control" }} 
     {{ form.active_members|add_class:"form-control" }} 
     <input class="form-control" type="submit" value="Update" /> 
     </div> 
    </div> 
</form> 
{% endblock %} 

models.py:

from django.db import models 
from django.utils import timezone 


class Order(models.Model): 
    customer = models.ForeignKey('Customer') 
    member = models.ForeignKey('Member') 
    order_text = models.CharField(max_length=200) 
    pick_up = models.CharField(max_length=200) 
    destination = models.CharField(max_length=200) 
    created_date = models.DateTimeField(default=timezone.now) 
    changed_date = models.DateTimeField(blank=True, null=True) 

    def created(self): 
     self.changed_date = timezone.now() 
     self.save() 

    def __str__(self): 
     return self.order_text 


class Customer(models.Model): 
    company_name = models.CharField(max_length=200) 
    created_date = models.DateTimeField(default=timezone.now) 
    changed_date = models.DateTimeField(blank=True, null=True) 

    def created(self): 
     self.changed_date = timezone.now() 
     self.save() 

    def __str__(self): return self.company_name 


class Member(models.Model): 
    lastname = models.CharField(max_length=20) 
    firstname = models.CharField(max_length=20) 
    created_date = models.DateTimeField(default=timezone.now) 
    changed_date = models.DateTimeField(blank=True, null=True) 
    active = models.BooleanField(default=True) 

    def created(self): 
     self.changed_date = timezone.now() 
     self.save() 

    def __str__(self): 
     return self.lastname 
+0

請顯示您的模型。 – Alasdair

+0

剛剛更新了我的文章。 – oldsport

回答

0

它soun像你想限制Order.members字段的選項爲active=True

您可以通過創建模型表單並更改__init__方法中的查詢集來完成此操作。

from django import forms 

class OrderForm(forms.ModelForm): 
    class Meta: 
     fields = ['order_text', 'customer', 'members'] 

    def __init__(self, *args, **kwargs): 
     super(OrderForm, self).__init__(*args, **kwargs) 
     self.fields['members'].queryset = Member.objects.all().filter(active=True) 

然後更新您的設置form_class使用模型表單視圖。

class Orders_update(UpdateView): 
    model = Order 
    form_class = OrderForm 
    ... 

最後,外地通話的成員,所以你應當將模板更改爲:

{{ form.member|add_class:"form-control" }} 

順便說一句,它是不推薦使用相對URL像'../../../orders'。最好使用reverse_lazy。例如,如果URL模式的名稱是orders,那麼您可以使用:

success_url = reverse_lazy('orders') 
+0

謝謝你,幫了我很多!但是在訂單表單中,我不得不在'class Meta:'之後添加'model = Member',而在__init__中它需要'self.fields ['members']。queryset'。有了這個,我得到了預期的結果。如果你更新答案,我會接受你的答案。 – oldsport

+0

我修復了設置查詢集的行。我認爲你不需要在表單中設置'model',因爲你在視圖中做了這個,但是我可能記錯了。但是,如果你設置模型,它應該是'Order',而不是'Member'。 – Alasdair

+0

Thx,你是對的! – oldsport

相關問題