2017-10-09 1 views
0

Ich arbeite an einfachen Ausgaben Manager. Jeder Benutzer kann eine Operation hinzufügen/entfernen/bearbeiten, die Ausgaben oder Einnahmen darstellt. Ich habe jedoch einen Fehler bemerkt - beim Hinzufügen einer neuen Operation ist es möglich andere Accounts und Kategorien zu wählen.Wie kann man die Feldauswahl für eine andere Tabelle in der Datenbank begrenzen?

Hier ist mein Betrieb Modell:

class Operation(models.Model): 

    def get_category_color(self): 
     return Category.objects.get(name=self.category).color 

    types_tuples = ((-1, 'expense'), (1, 'earning')) 

    user = models.ForeignKey(User) 
    account = models.ForeignKey(Account) 
    category = models.ForeignKey(Category) 
    date = models.DateField() 
    amount = models.DecimalField(max_digits=10, decimal_places=2) 
    type = models.IntegerField(choices=types_tuples) 
    currency = models.CharField(max_length=3) 

    color = property(get_category_color) 

OperationCreate Ansicht:

class OperationCreate(CreateView, OperationMixIn): 

    model = Operation 
    form_class = OperationForm 
    success_url = reverse_lazy('manage_operations') 

    def form_valid(self, form): 
     operation = form.save(commit=False) 
     operation.currency = Account.objects.get(pk=form.instance.account_id).currency 
     self.update_account_balance(form) 
     form.instance.user = self.request.user 
     return super(OperationCreate, self).form_valid(form) 

und OperationForm:

class OperationForm(ModelForm): 
    class Meta: 
     model = Operation 
     fields = ['account', 'type', 'category', 'date', 'amount'] 

Die Frage ist, wie kann ich Entscheidungen für Konto und Kategorie beschränken, die sind während der Buchung neuer Operation verfügbar? Ich möchte, dass Benutzer nur diejenigen sehen, die mit ihrem Konto in Verbindung stehen.

Ich versuchte limit_choices_to als Parameter für models.ForeignKey(Account) und models.ForeignKey(Category) in Operation Modell aber konnte es nicht so funktionieren lassen.

Ich nehme an, dass ich eine Abfrage verwenden muss, die nur Konten und Kategorien zurückgibt, die sich auf den aktuellen Benutzer beziehen. Ich habe jedoch keine Ahnung, wie und wo ich es anwenden soll.

Können Sie mir bitte in die richtige Richtung zeigen?

EDIT:

OperationForm aufgrund @efkin Vorschlag bearbeitet:

class OperationForm(ModelForm): 
    class Meta: 
     model = Operation 
     fields = ['account', 'type', 'category', 'date', 'amount'] 

    def __ini__(self, user, *args, **kwargs): 
     super(OperationForm, self).__init__(*args, **kwargs)  
     self.fields['account'] = ModelChoiceField(queryset=Account.objects.filter(user=user)) 
     self.fields['category'] = ModelChoiceField(queryset=Category.objects.filter(user=user)) 

Antwort

1

Sie ein einfaches Formular mit ModelChoiceField Felder für Fremdschlüssel verwenden könnten.

+0

Hey, danke für eine Antwort. Ich habe es nachgeschlagen und habe verwandte Fragen. Ich nehme an, dass ich mein Operationsformular auf die folgende Weise ändern konnte, die ich in der Bearbeitung meines ursprünglichen Posts zeigte. Ich bin mir nicht sicher, aber wie kann ich 'request.user' aus den Ansichten übergeben. – Arxas

+0

Okay, ich habe den Weg gefunden, diesen 'request.user' Parameter zu übergeben. Siehe die Lösung unten :) – Arxas

0

Okay, also habe ich ein bisschen mehr gegraben und die Lösung gefunden. OperationForm muss ModelChoiceFiled modifiziert werden (wie @efkin gesagt) und OperationCreate sollte enthält Überschreibung für get_form_kwargs Methode von ModelFormMixIn:

class OperationCreate(CreateView, OperationMixIn): 

    model = Operation 
    form_class = OperationForm 
    success_url = reverse_lazy('manage_operations') 

    def get_form_kwargs(self): 
     kwargs = super(OperationCreate, self).get_form_kwargs() 
     kwargs.update({'user': self.request.user}) 
     return kwargs 

    def form_valid(self, form): 
     operation = form.save(commit=False) 
     operation.currency = Account.objects.get(pk=form.instance.account_id).currency 
     self.update_account_balance(form) 
     form.instance.user = self.request.user 
     return super(OperationCreate, self).form_valid(form) 
Verwandte Themen