[Django] Afficher les données d'inscription associées aux utilisateurs sur le formulaire d'inscription / d'édition (formulaire)

Chose que tu veux faire

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. todo_2.png

Supposons que vous ayez deux catégories enregistrées comme utilisateurs connectés, comme indiqué ci-dessous. todo_3-crop.png

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.

todo_1.png

environnement

Python 3.8.0 Django 3.0.4 Bootstrap 4.1.3 Plugin: django-bootstrap-modal-forms

manière

J'ai fait référence à cette page.

Modèle à utiliser


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

Modification de forms.py


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

Modifier views.py


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

en conclusion

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

[Django] Afficher les données d'inscription associées aux utilisateurs sur le formulaire d'inscription / d'édition (formulaire)
Recréez l'écran d'inscription du personnel de Django avec la classe
Afficher l'image après l'augmentation des données avec Pytorch
Comment enregistrer les mêmes données plusieurs fois avec une seule entrée sur l'écran de gestion de Django
Jusqu'au début du tutoriel django avec pycharm sous Windows
Premiers pas avec le framework Python Django sur Mac OS X
[Django] Corrige le pluriel du nom du modèle sur l'écran de gestion
Essayez Ajax sur la page Django
Afficher le chemin absolu sur le Finder
Modifiez le fichier du serveur de destination de la connexion SSH sur le serveur avec VS Code
Comment enregistrer une seule donnée sur l'écran de gestion de Django