2017-09-17 2 views
1

Wie kann ich die für ein ForeignKey-Feld in einem Modellformular angezeigten Optionen filtern?Django-Filterauswahl im ForeignKey-Feld in einem ModelForm

Ich habe versucht, diesem Thread How do I filter ForeignKey choices in a Django ModelForm? zu folgen, aber ich bin ziemlich neu in Django und ich wurde sehr verwirrt.

Ich habe eine App für Nutzer (mit Usermanager/AbstractUser Modelle, nicht relevant)

Eine weitere App für:

  • Produkte, mit product_id und Produktnamen, die
  • Käufe, mit product_id und Benutzer-ID.

Eine weitere App für Tickets, mit einem Formular, um ein Ticket zu öffnen.

In diesem Formular möchte ich nur die Produkte zeigen, die der Benutzer gekauft hat, so dass der Benutzer nur ein Ticket für die Produkte öffnen kann, die er hat.

-Code unten, ich habe entfernt nicht relevante Felder etc.

Ticket Modell

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'] 

Produkt & Kauf Modelle

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

Neues Ticket Formularansicht

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) 

In der Vorlage I {{ticket_form}} in der Form verwendet werden.

Vielen Dank im Voraus.

+0

Jede andere Anregung/Erklärung? Danke in fortgeschrittenem! – Ire

Antwort

0

Nachschlag einfach alle vom Benutzer vorgenommenen Käufe durch die Abbildung der user Fremdschlüssel. Sobald Sie die Einkäufe haben, haben Sie auch die entsprechenden Produkte.

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

jetzt Ihre products Liste ist eine Liste der Objekte, der vom Benutzer vorgenommenen Käufe. Wenn Sie den Namen der Käufe wollen, fügen Sie einfach die Zeile:

product_names = [product.name for product in products] 

wo product_names ist eine Liste mit den Namen des Produkts durch den jeweiligen Benutzer gekauft.

Hoffe, das hilft!

+0

Danke dartvader1996, das macht Sinn, aber wo verwende ich diesen Code? Im Modell? Das ist mit dem Produkt-Objekt gebaut, und ich denke, ich kann so etwas nicht machen. In der ModelForm? Ich dachte da, ich sage nur, welche Felder ich von dem Modell will. Nach Ansicht ticket_new? Das ist wahrscheinlich zu spät, da das Formular bereits gezeigt wird. Danke! – Ire

+0

Der schwierige Teil für mich ist, dass ich diese Filter/Abfrage für ein Feld im Formular brauche. – Ire