2017-09-17 88 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) 
    ... 

新工單窗體視圖

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) 

在我使用{{ticket_form}}表單中的模板。

在此先感謝。

+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.name for product in products] 

其中product_names是由特定用戶購買的產品的名稱的列表。

希望這會有所幫助!

+0

感謝dartvader1996,這是有道理的,但我在哪裏使用該代碼? 在模型中?這是用產品對象構建的,我想我不能在那裏做這樣的事情。 在ModelForm中?我想在那裏我只是說模型中我想要的領域。 在視圖ticket_new?這可能會延遲,因爲表格已經被顯示。 謝謝! – Ire

+0

對我來說,棘手的部分是我需要這個過濾器/查詢表單中的一個字段。 – Ire