2017-09-17 3 views
1

Comment filtrer les options affichées pour un champ ForeignKey dans un formulaire modèle?Choix du filtre Django dans le champ ForeignKey dans une ModelForm

J'ai essayé de suivre ce fil How do I filter ForeignKey choices in a Django ModelForm? mais je suis assez nouveau à Django et j'ai été très confus.

J'ai une application pour les utilisateurs (avec un UserManager/modèles AbstractUser non pertinents)

Une autre application pour:

  • Produits, avec product_id et nom du produit,
  • Achats, avec product_id et user_id.

Une autre application pour les billets, avec un formulaire pour ouvrir un ticket.

Dans cette forme je veux montrer seulement les produits que l'utilisateur a achetés, ainsi l'utilisateur peut seulement ouvrir un billet pour les produits qu'il a.

code ci-dessous, je l'ai retiré non champs pertinents, etc.

Modèle Ticket

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

Ticket ModelForm

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

Produit & Achat Modèles

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) 
    ... 

nouveau ticket vue formulaire

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) 

Dans le modèle que j'utilise {{}} ticket_form dans le formulaire.

Merci d'avance.

+0

Autre suggestion/explication? Merci à l'avance! – Ire

Répondre

0

Il suffit de rechercher tous les achats effectués par l'utilisateur en mappant la clé étrangère user. Une fois que vous aurez les achats, vous aurez également les produits correspondants.

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

maintenant votre liste products est une liste d'objets des achats effectués par l'utilisateur. Si vous voulez que le nom des achats, il suffit d'ajouter la ligne:

product_names = [product.name for product in products] 

product_names est une liste des noms des produits achetés par l'utilisateur particulier.

Espérons que cela aide!

+0

Merci dartvader1996, c'est logique, mais où puis-je utiliser ce code? Dans le modèle? Cela est construit avec l'objet des produits, et je suppose que je ne peux pas faire des choses comme ça là-bas. Dans le ModelForm? Je pensais là je dis juste quels champs je veux du modèle. Dans la vue ticket_new? C'est probablement trop tard puisque le formulaire est déjà affiché. Merci! – Ire

+0

La partie difficile pour moi est que j'ai besoin de ce filtre/requête pour un champ dans le formulaire. – Ire