2016-12-10 1 views
1

はモデルを持っている:フォームクリーンなデータ目的球にobject.id要求するために、どのように

私は variation_1かどうかをチェックしますきれいな関数を作成する必要がforms.py

class OrderForm(forms.ModelForm): 
    variations_select = forms.ChoiceField(choices=VARIATIONS) 

    class Meta: 
     model = Order 
     fields = [ 
      'variations_select' 
     ] 

class Product(models.Model): 
    user = models.ForeignKey(User, on_delete=models.CASCADE) 
    name = models.CharField(max_length=50) 
    variation_1 = models.BooleanField(default=True) 
    variation_2 = models.BooleanField(default=True) 
    variation_3 = models.BooleanField(default=True) 


class Order(models.Model): 
    buyer = models.ForeignKey(User, related_name='buyer') 
    product = models.ForeignKey(Product) 
    variations_select = models.CharField(max_length=50, choices=VARIATIONS) 

Productではvariation_2またはvariation_3が利用可能です。これのために必要なリクエストProduct.iddef clean_variations_select(self):これを行うには?

def clean_variations_select(self): 
    product = Product.object.get(id = product.id) 
    variations_select = self.cleaned_data.get("variations_select") 
     if variations_select == "Variation_1" and product.variation_1 == False: 
       raise forms.ValidationError("variation_1 was sold already") 
     else: 
       return variations_select 

product = Product.object.get(id = product.id)は - 原因の注文がまだデータベースに作成されていない動作しません(ただし、新しい秩序の創造にビュー・リンクをレンダリングする際に私が持っている../product.id/new_order)。

+0

あなたはあなたの「urls.py」を投稿できますか? –

+0

'Order'クラスの' product'モデルフィールドは、 'Product'クラスとは外部キー関係を持ちませんが、' WowRaid'に代わっていますか?それがあなたのデザインのためにどうなったのですか? –

答えて

0

あなたのクラスには__init__のメソッドを定義する必要があります。これはあなたのプロダクトIDを引数として受け入れるべきです。

def __init__(self,*args,**kwargs): 
    self.product_id = kwargs.pop('product_id') 
    super(OrderForm,self).__init__(*args,**kwargs) 

フォームを初期化すると、キーワード引数としてproduct_idが渡されます。

OrderForm(request.POST, product_id=product_id) 

、きれいな方法であなたが望むProductオブジェクトを取得するためにself.product_idを使用することができます。

def clean_variations_select(self): 
    product = Product.object.get(id=self.product_id) 
    variations_select = self.cleaned_data.get("variations_select") 
    if variations_select == "Variation_1" and product.variation_1 == False: 
     raise forms.ValidationError("variation_1 was sold already") 
    else: 
     return variations_select 
+0

big thx itが役立つ – Hellbea

関連する問題