Lorsque je prépare deux tables avec des restrictions de clé externe (FOREIGN KEY) dans Model, je souhaite afficher les données d'enregistrement associées à l'utilisateur (utilisateur connecté) dans Form. Je suis tombé sur la façon dont j'ai utilisé la vue générique basée sur les classes, alors prenez-en note.
Par exemple, créez la liste Todo suivante. À l'heure actuelle, plusieurs catégories peuvent être sélectionnées pour un élément Todo.
Supposons que vous ayez deux catégories enregistrées comme utilisateurs connectés, comme indiqué ci-dessous.
Pour le moment (bien entendu), je souhaite sélectionner uniquement la catégorie enregistrée par l'utilisateur connecté dans le formulaire d'inscription et d'édition.
Python 3.8.0 Django 3.0.4 Bootstrap 4.1.3 Plugin: django-bootstrap-modal-forms
J'ai fait référence à cette page.
# 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
Dans le cas de l'exemple ci-dessus, le modèle utilisé a deux tables, une table TodoItem et une table Category avec une contrainte de clé externe (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 ajoute la description de def \ _ \ _ init \ _ \ _ () comme ci-dessus.
# 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
Dans views.py, ajoutez la description de def get \ _form \ _kwargs () comme ci-dessus. La partie def form \ _valid () de CreateView est le code pour enregistrer l'utilisateur connecté en tant qu'utilisateur au moment de l'inscription.
Décrit comment afficher les données d'enregistrement associées à l'utilisateur sur le formulaire d'inscription / d'édition. Je pense que c'est un point fondamental, mais si vous êtes un débutant comme moi, vous ne pourrez peut-être pas trouver un article approprié et vous ne pourrez peut-être pas le résoudre immédiatement, alors j'espère que vous pourrez vous y référer.
Recommended Posts