2017-09-17 27 views
1

モデルフォームのForeignKeyフィールドに表示されるオプションをフィルタリングするにはどうすればよいですか?ModelFormのForeignKeyフィールドのDjangoフィルタ選択肢

私はこのスレッドHow do I filter ForeignKey choices in a Django ModelForm?に従ってみましたが、私はDjangoにはかなり新しく、とても混乱しました。

は私がユーザーのためのアプリを持っている

別のアプリ(、関連していないのUserManager/AbstractUserモデルとの)について:

  • 製品、PRODUCT_IDとPRODUCT_IDおよび製品名、
  • 購入、とおよびuser_id。

チケットの別のアプリで、チケットを開くためのフォームがあります。

このフォームでは、ユーザーが購入した製品のみを表示したいので、ユーザーは自分が所有している製品のチケットのみを開くことができます。

以下のコードを、私は

チケットモデル

class Ticket(models.Model): 
    ... 
    user = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='tickets') 
    product = models.ForeignKey('products.Product', related_name='tickets') 

チケットのModelForm

class TicketForm(forms.ModelForm): 
    class Meta: 
     model = Ticket 
     fields = ['subject', 'reason', 'product'] 

製品&購入モデル

class Product(models.Model): 
    name = models.CharField(max_length=100, default="") 
    ... 


class Purchase (models.Model): 
    user = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='purchases') 
    product = models.ForeignKey(Product) 
    ... 
など、非関連フィールドを削除しました

新規チケットフォームIは、フォーム内の{{ticket_form}}使用するテンプレートにビュー

def new_ticket(request): 
    if request.method=='POST': 
     ticket_form = TicketForm(request.POST) 
     ... 

     if ticket_form.is_valid() and comment_form.is_valid(): 
      ticket = ticket_form.save(False) 
      ticket.user = request.user 
      ticket.save() 
      ... 
      return redirect(reverse('ticket-detail', args={ticket.pk})) 
    else: 
     ticket_form = TicketForm() 

    args={'ticket_form':ticket_form} 
    args.update(csrf(request)) 
    return render(request, 'tickets/ticket_form.html',args) 

ありがとうございます。

+0

他の提案や説明はありますか? ありがとうございました! – Ire

答えて

0

外部キーuserをマッピングすることで、ユーザーが行ったすべての購入を検索するだけです。購入を済ませたら、対応する製品も購入します。

user = 'your user object here' 
purchases = Purchase.objects.filter(user=user) 
products = [purchase.product for purchase in purchases] 

今、あなたのproductsリストは、ユーザによって行われた購入のオブジェクトのリストです。 product_namesは、特定のユーザーが購入し、製品の名前のリストである

product_names = [product.name for product in products] 

:あなたが購入の名前をしたい場合は、単に行を追加します。

希望すると便利です。

+0

ありがとうdartvader1996、意味がありますが、どこでそのコードを使用しますか? モデルでは?それは製品オブジェクトで構築されており、私はそこでこのようなことをすることはできないと思います。 ModelFormでは?私はそこに、私がモデルから望んでいるフィールドだけを言うと思った。 ビューでは、ticket_new?フォームがすでに表示されているため、おそらく遅くなります。 ありがとう! – Ire

+0

私にとって難しい部分は、フォーム内のフィールドに対してこのフィルタ/クエリが必要なことです。 – Ire

関連する問題