2012-03-29 14 views
1

Djangoのformはあまりよくありません。ここでジェネリックビューを使用してフォームのビューをカスタマイズする方法DjangoのCreateView

は、これまでのところ、私は私のテンプレートでurls.py

url(
    r'^orders/create/$', 
    CreateView.as_view(
     model = Order, 
     template_name = 'doors/orders/create.html', 
     form_class = OrderCreateForm 
    ), 
    name = 'orders_create' 
), 

Orderモデルの汎用ビューCreateViewを使用していますmodels.py

class Order(models.Model) : 
    def __unicode__(self) : 
     return unicode(self.pk) 

    def get_absolute_url(self) : 
     return reverse('orders_detail', args = [ self.pk ]) 

    STATUS_CHOICES = (
     ('p', 'pending' ), 
     ('a', 'approved'), 
     ('r', 'rejected'), 
     ('c', 'closed' ), 
     ('l', 'locked' ), 
    ) 

    WORK_TYPE_CHOICES = (
     ('hc', 'Heating and cooling'), 
     ('el', 'Electrical'   ), 
     ('pl', 'Plumbing'   ), 
     ('ap', 'Appliances'   ), 
     ('pe', 'Pests'    ), 
     ('ex', 'Exterior'   ), 
     ('in', 'Interior'   ), 
     ('sa', 'Safety'    ), 
     ('ot', 'Others'    ), 
    ) 

    creator = models.ForeignKey(User, related_name = 'creator') 
    approver = models.ForeignKey(User, related_name = 'approver') 
    comments = models.TextField(blank = True) 
    status = models.CharField(max_length = 1, choices = STATUS_CHOICES, default = 'p') 
    quote  = models.DecimalField(max_digits = 8, decimal_places = 2, null = True, blank = True) 
    payment = models.DecimalField(max_digits = 8, decimal_places = 2, null = True, blank = True) 
    work_type = models.CharField(max_length = 2, choices = WORK_TYPE_CHOICES) 
    vendor = models.ForeignKey(Vendor, null = True, blank = True) 
    created = models.DateTimeField(auto_now_add = True) 
    modified = models.DateTimeField(auto_now = True) 

class OrderCreateForm(ModelForm) : 
    class Meta : 
     model = Order 
     fields = (
      'creator', 
      'approver', 
      'comments', 
      'work_type', 
     ) 

からOrderですが、私は単に持っている

{% extends "base.html" %} 

{% block title %}Create order{% endblock %} 

{% block content %} 
    {{ form }} 
{% endblock %} 

それは、この

のように(無送信ボタン付き)部分のフォームを作成するには、しかし、私はuser.get_profile().user_typeに応じてcreatorapproverフィールドの可視性を制御したいです。ログインしたユーザーのuser_typeがマネージャーでない場合、creatorは自動的にユーザーとして設定され、approverも自動的に設定されます。 user_typeがマネージャーの場合、そのユーザーは両方のフィールドを異なるユーザーに指定できます。

また、各フィールドの実際のラベルに名前を付けることもできます。たとえば、Work typeCategoryに変更します。

現在、私はこれを行う唯一の方法は{% for field in form %}をテンプレート内に入れて、{% if field.name == "creator" %}のような一連の行を実行することだと考えています。制御ループとif-thenステートメントの束より簡単な方法はありますか?

答えて

1

user.get_profile()。user_typeに応じて、作成者フィールドと承認者フィールドの表示を制御したいと考えています。ログインしているユーザのuser_typeがマネージャでない場合、作成者は自動的にユーザとして設定され、承認者も自動的に設定されます。 user_typeがマネージャーの場合、そのユーザーは両方のフィールドを異なるユーザーに指定できます。

私は、ユーザーのために別のフォームを作ると思います:

class UserOrderCreateForm(ModelForm) : 
    class Meta : 
     model = Order 
     fields = (
      'comments', 
      'work_type', 
     ) 

    def __init__(self, *args, **kwargs): 
     self.user = kwargs.pop('user') 
     super(UserOrderCreateForm, self).__init__(*args, **kwargs) 

    def save(self): 
     result = super(UserOrderCreateForm, self).save(commit=False) 
     result.creator = self.user 
     result.approver = self.user.some_other_field # "will be set also set automatically" 
     result.save() 
     return result 

次にビューで使用するためにどのような形を決めることができます。私はあなたがそれをCreateViewで動作させるためにいくつかの時間を費やす必要がなると思う

form = UserOrderCreateForm(user=request.user) 

のようにそれを使用してください。だから私はCBVが気に入らない。 :-)

また、各フィールドの実際のラベルに名前を付けることもできます。たとえば、Work typeCategoryに変更します。

work_type = models.CharField(max_length = 2, choices = WORK_TYPE_CHOICES, verbose_name=u'Category') 
+0

ありがとうございます。あなたが参照していた "CBV"は何ですか?一般的なビュー? – hobbes3

+0

@ hobbes3関数ベースのクラスベースのビューです。 – DrTyrsa

+0

あなたは、私は自分のビューを 'views.py'で作成することを提案していますか? – hobbes3

関連する問題