2017-09-17 92 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