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))
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
Okay, ich habe den Weg gefunden, diesen 'request.user' Parameter zu übergeben. Siehe die Lösung unten :) – Arxas