Является ли слово «профиль» встроенным в Django? - PullRequest
1 голос
/ 24 мая 2019

Я новичок в Джанго. Ниже приведен код для создания профиля пользователя при регистрации нового пользователя для моего блога.

Сомнение: - Почему мы используем профиль вместо профиля в последней строке кода? обратите внимание на заглавное слово «Профиль»

from django.db.models.signals import post_save
from django.contrib.auth.models import User
from django.dispatch import receiver
from .models import Profile


@receiver(post_save, sender=User)
def create_profile(sender, instance, created, *args,**kwargs):
    if created:
        Profile.objects.create(user=instance)


@receiver(post_save, sender=User)
def save_profile(sender, instance, *args,**kwargs):
    instance.profile.save()'''  #last code line

Ответы [ 2 ]

2 голосов
/ 24 мая 2019

Нет , это не встроенная функция. Если вы определяете отношение из вашей модели (например, от Profile до User), Django автоматически создает обратную связь. Вы можете указать имя этого отношения с атрибутом related_name.

Таким образом, вы можете указать имя по-другому, изменив related_name [Django-doc] отношения, например:

from django.db import models
from django.contrib.auth import get_user_model

class Profile(models.Model):
    user = models.OneToOneField(
        get_user_model(),
        on_delete=models.CASCADE,
        <b>related_name='other_attribute'</b>
    )

В этом случае имя профиля:

from django.contrib.auth import get_user_model

@receiver(post_save, sender=get_user_model())
def save_profile(sender, instance, *args,**kwargs):
    instance.<b>other_attribute</b>.save()

По умолчанию значение related_name является именем класса, но в в нижнем регистре и с подчеркиванием (_) в качестве разделителя слов.

Это соответствует PEP-8 , где атрибуты класса записываются в нижнем регистре и с подчеркиванием в качестве разделителя слов.

1 голос
/ 24 мая 2019

Я думаю, что в вашем коде Профиль это имя модели:

Class Profile(models.Model)

и профиль является родственным именем обратного отношения, например:

class Profile(models.Model):
user= models.OneToOneField(User,on_delete=models.CASCADE,related_name="profile")

когда вы хотите использовать все объекты модели Use:

Profile.objects.all()

и когда вы хотите использовать пользовательские объекты:

userobject.profile.<other fields name>
...