Wenn ich in Model zwei Tabellen mit Einschränkungen für externe Schlüssel (FOREIGN KEY) vorbereite, möchte ich die Registrierungsdaten, die dem Benutzer (protokollierter Benutzer) zugeordnet sind, in Form anzeigen. Ich bin auf die Art und Weise gestoßen, wie ich die klassenbasierte generische Ansicht verwendet habe. Notieren Sie sich diese.
Erstellen Sie beispielsweise die folgende Todo-Liste. Derzeit können mehrere Kategorien für einen Todo-Artikel ausgewählt werden.
Angenommen, Sie haben zwei Kategorien als angemeldete Benutzer registriert (siehe unten).
Zu diesem Zeitpunkt möchte ich (selbstverständlich) nur die Kategorie auswählen, die vom angemeldeten Benutzer im Registrierungs- und Bearbeitungsformular registriert wurde.
Python 3.8.0 Django 3.0.4 Bootstrap 4.1.3 Plugin: django-bootstrap-modal-forms
Ich habe auf [diese Seite] verwiesen (https://stackoverflow.com/questions/24041649/filtering-a-model-in-a-createview-with-get-queryset).
# mypeoject/myapp/models.py
import datetime
from django.db import models
class Category(models.Model):
category_name = models.CharField(max_length=20, unique=True)
user = models.ForeignKey(
'auth.User',
on_delete=models.CASCADE
)
def __str__(self):
return self.category_name
class TodoItem(models.Model):
item = models.CharField(max_length=50)
item_date = models.DateField(default=datetime.date.today)
categories = models.ForeignKey(Category, null=True, on_delete=models.SET_NULL)
user = models.ForeignKey(
'auth.User',
on_delete=models.CASCADE
)
def __str__(self):
return self.item
Im obigen Beispiel verfügt das verwendete Modell über zwei Tabellen, eine TodoItem-Tabelle und eine Kategorietabelle mit einer Einschränkung für einen externen Schlüssel (FOREIGN KEY).
# mypeoject/myapp/forms.py
from bootstrap_modal_forms.forms import BSModalForm
from django import forms
from queryset_filtering_app.models import TodoItem, Category
class CreateUpdateTodoItemForm(BSModalForm):
class Meta:
model = TodoItem
fields = ['item', 'item_date', 'categories']
def __init__(self, *args, **kwargs):
user = kwargs.pop('user')
super(CreateUpdateTodoItemForm, self).__init__(*args, **kwargs)
self.fields['categories'].queryset = Category.objects.filter(user=user)
class CreateCategoryForm(forms.ModelForm):
class Meta:
model = Category
fields = ["category_name"]
forms.py fügt die Beschreibung von def \ _ \ _ init \ _ \ _ () wie oben hinzu.
# mypeoject/myapp/views.py
class CreateTodoItemFormView(BSModalCreateView):
template_name = 'template_name.html'
form_class = CreateUpdateTodoItemForm
success_message = 'Success: Item was created.'
success_url = reverse_lazy('redirect_name')
def get_form_kwargs(self):
kwargs = super(CreateTodoItemFormView, self).get_form_kwargs()
kwargs['user'] = self.request.user
return kwargs
def form_valid(self, form):
form.instance.user_id = self.request.user.id
return super(CreateTodoItemFormView, self).form_valid(form)
class UpdateTodoItemFormView(BSModalUpdateView):
model = TodoItem
template_name = 'template_name.html'
form_class = CreateUpdateTodoItemForm
success_message = 'Success: Item was updated.'
success_url = reverse_lazy('redirect_name')
def get_form_kwargs(self):
kwargs = super(UpdateTodoItemFormView, self).get_form_kwargs()
kwargs['user'] = self.request.user
return kwargs
Fügen Sie in views.py die Beschreibung von def get \ _form \ _kwargs () wie oben hinzu. Der def form \ _valid () Teil von CreateView ist der Code zum Registrieren des angemeldeten Benutzers als Benutzer zum Zeitpunkt der Registrierung.
Beschrieben, wie die dem Benutzer zugeordneten Registrierungsdaten im Registrierungs- / Bearbeitungsformular angezeigt werden. Ich denke, es ist ein grundlegender Punkt, aber wenn Sie ein Anfänger wie ich sind, können Sie möglicherweise keinen geeigneten Artikel finden und ihn möglicherweise nicht sofort lösen. Ich hoffe, Sie können sich darauf beziehen.
Recommended Posts