Почему я не могу отобразить больше полей в django? - PullRequest
1 голос
/ 18 марта 2020

Я пытаюсь создать социальный веб-сайт и хочу отобразить биографию и группу крови пользователя на странице его профиля, а также их имя и адрес электронной почты. Хотя имя и адрес электронной почты отображаются на странице профиля, их биография и группа крови не отображаются, хотя я написал для них тот же код, что и их имя и адрес электронной почты. Может ли кто-нибудь помочь мне?

Мой models.py:

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

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete = models.CASCADE)
    image = models.ImageField(default='default.jpg', upload_to='profile_pics')

    def __str__(self):
        return f'{self.user.username} Profile'

my forms.py:

from django import forms
from django.contrib.auth.models import User
from django.contrib.auth.forms import UserCreationForm



class UserRegisterForm(UserCreationForm):
    email = forms.EmailField()
    CHOICES = (
        ('type', 'AB+'),
        ('type', 'AB-'),
        ('type', 'A+'),
        ('type', 'A-'),
        ('type', 'B+'),
        ('type', 'B-'),
        ('type', 'O+'),
        ('type', 'O-'),
        )
    bloodgroup = forms.CharField(widget=forms.Select(choices=CHOICES))
    bio = forms.CharField()


    class Meta:
        model = User
        fields = ['username', 'email', 'bio', 'bloodgroup', 'password1', 'password2']

мой профиль. html:

{% extends "blog/base.html" %}
{% load crispy_forms_tags %}
{% block content %}
    <div class="content-section">
      <div class="media">
        <img class="rounded-circle account-img" src="{{ user.profile.image.url }}">
        <div class="media-body">
          <h2 class="account-heading">{{ user.username }}</h2>
          <p class="text-secondary">{{ user.email }}</p>
          <p class="text-primary">{{ user.bio }}</p>
          <p2 class="text-info">Blood Group - {{ user.bloodgroup }}</p2>
        </div>
      </div>
      <!-- FORM HERE -->
    </div>
{% endblock content %}

Ответы [ 3 ]

3 голосов
/ 18 марта 2020

Модель пользователя по умолчанию не содержит полей bloodgroup и bio, поэтому вам просто нужно наследовать модель User(AbstractUser) в вашем файле model.py и определять только новые поля в этом классе, остальные поля по умолчанию будут наследоваться. После этого вы можете назначать атрибуты для полей в формах.

Попробуйте это и дайте мне знать, работает ли он или нет ..

0 голосов
/ 18 марта 2020

Для этого вам нужно расширить AbstractUser, как показано ниже, и добавить дополнительное поле в соответствии с вашими требованиями ...

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


class User(AbstractUser):
    bloodgroup = models.CharField(name="bloodgroup", max_length=10, null=True, blank=True)
    bio = models.CharField(name="bio", max_length=100, null=True, blank=True)

И предположим, что эта модель пользователя находится в приложении с именем app_1, тогда вы должны установить AUTH_USER_MODEL в настройках .py как показано ниже ...

settings.py

AUTH_USER_MODEL = "app_1.User"

Выполните команду makemigrations и migrate, потому что мы изменили модель.

И ваша форма должна быть такой, как показано ниже ...

from django import forms

class UserRegisterForm(forms.ModelForm):
    email = forms.EmailField()
    CHOICES = (
        ('type', 'AB+'),
        ('type', 'AB-'),
        ('type', 'A+'),
        ('type', 'A-'),
        ('type', 'B+'),
        ('type', 'B-'),
        ('type', 'O+'),
        ('type', 'O-'),
        )
    bloodgroup = forms.CharField(widget=forms.Select(choices=CHOICES))
    bio = forms.CharField()


    class Meta:
        model = User
        fields = '__all__'
0 голосов
/ 18 марта 2020

django .contrib.auth.models Модель пользователя не содержит никаких полей, называемых био или группой крови, которые вы используете. Вам необходимо унаследовать модель User и создать собственную модель с этими 2 атрибутами.

Когда вы используете user.username и user.email. Он извлекается из объекта User, который вы передали в шаблон.

from django.contrib.auth.models import AbstractUser
class Profile(AbstractUser):
    REQUIRED_FIELDS = ['username']
    user = models.OneToOneField(User, on_delete = models.CASCADE)
    image = models.ImageField(default='default.jpg', upload_to='profile_pics')
    bio = models.CharField(max_length=14, blank=True, default=None)
    bloogroup = models.CharField(max_length=14, blank=True, default=None)

и для использования форм

class UserRegisterForm(ModelForm):
   class Meta:
       model = Profile
       fields = '__all__'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...