Как использовать Customize Model расширяется от User Model в Django? - PullRequest
0 голосов
/ 05 марта 2020

Я новичок в Django, и у меня есть проблема, которая меня сильно смущает. У меня есть страница, когда пользователи щелкают, чтобы сменить профиль, появляется соответствующая страница и позволяет пользователям обновить свой профиль. Вот моя модель:

from django.db import models

import os
from django.db import models
from django.contrib.auth.models import User
from django.conf import settings
from django.utils import timezone
from django.db.models.signals import post_save
from django.dispatch import receiver


# Create your models here.
class Account(models.Model):
    user = models.ForeignKey(User, on_delete="CASCADE")
    phone = models.CharField(max_length=18)
    room = models.CharField(max_length=8)
    dob = models.DateField(default=timezone.datetime.now())
    active = models.BooleanField(default=True)
    avatar = models.ImageField(upload_to='images/', default=os.path.join(settings.STATIC_ROOT, 'avatar.png'))

    def __str__(self):
        return self.user.username

Вот мои формы:

class UserForm(forms.ModelForm):
    first_name = forms.CharField(max_length=100,
                                 widget=forms.TextInput(attrs={'class': 'uk-input', 'placeholder': 'Last Name'}))
    last_name = forms.CharField(max_length=100,
                                widget=forms.TextInput(attrs={'class': 'uk-input', 'placeholder': 'Last Name'}))

    class Meta:
        model = User
        fields = ['first_name', 'last_name', 'email']


class ProfileForm(forms.ModelForm):
    class Meta:
        model = Account
        fields = ['phone', 'room', 'dob', 'active', 'avatar']

И у меня есть мой views.py вот так:

def show_form(request):
    user_basic_info = UserForm(request.POST)
    form = ProfileForm(request.POST)

    if form.is_valid() and user_basic_info.is_valid():
        form.save() and user_basic_info.save()
        messages.sucess(request, _('Your profile has been successfully updated'))
        redirect('my_account')
    else:
        UserForm()
        ProfileForm()
    context = {
        'user_basic_info': user_basic_info,
        'form': form,
    }

    return render(request, 'my_account.html', context)

Вот my_account . html template:

{% extends 'base.html' %}

{% block title %}My account{% endblock %}

{% block breadcrumb %}
  <li class="breadcrumb-item active">Update your information</li>
{% endblock %}

{% block content %}
  <div class="row">
    <div class="col-lg-6 col-md-8 col-sm-10">
      <form method="post" novalidate>
        {% csrf_token %}
        {% include 'includes/form.html' %}
        <button type="submit" class="btn btn-success">Save changes</button>
      </form>
    </div>
  </div>
{% endblock %}

И формы. html:


{% load widget_tweaks %}
<table>
    <div class="form-group">############

{{ user_basic_info }} ############# This displays first_name, last_name and email. Also the problem's here, I want to make 2 forms in one form with a better style like the form below.
    </div>############
</table>
{% if form.non_field_errors %}
  <div class="alert alert-danger" role="alert">
    {% for error in form.non_field_errors %}
      <p{% if forloop.last %} class="mb-0"{% endif %}>{{ error }}</p>
    {% endfor %}
  </div>
{% endif %}

{% for field in form %}
<div class="form-group">
    {{ field.label_tag }} {% if form.is_bound %} {% if field.errors %} {% render_field field class="form-control is-invalid" %} {% for error in field.errors %}
    <div class="invalid-feedback">
        {{ error }}
    </div>
    {% endfor %} {% else %} {% render_field field class="form-control is-valid" %} {% endif %} {% else %} {% render_field field class="form-control" %} {% endif %} {% if field.help_text %}
    <small class="form-text text-muted">
        {{ field.help_text|safe }}
      </small> {% endif %}
</div>
{% endfor %}

Поэтому, когда пользователи хотят изменить свой профиль, эти поля first_name, last_name, email, phone, room, dob, active, avatar должны отображаться. Но первые 3 поля принадлежат модели User, а остальные поля определены в моей модели Account. Я хочу, чтобы когда пользователи отправляли форму, эти поля были связаны вместе, например, Учетная запись является экземпляром пользователя , и эта информация должным образом сохраняется в базе данных в модели Учетной записи (я просмотрел некоторые учебные пособия, но все еще не могу правильно сделай это). А при входе на страницу авторизуйтесь, используя модель пользователя, но при обновлении профиля это модель учетной записи и модель пользователя, но между ними нет никакой связи, как я могу исправить все эти ошибки, спасибо заранее.

Ответы [ 2 ]

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

Если вы используете пользователя по умолчанию, есть 4 способа его расширения, поэтому здесь я даю ссылку, следуйте за ними,

, если вы используете пользователя по умолчанию, вам нужно использовать форму Usercreation для регистрации, потому что пользовательская модель имеет алгоритм шифрования пароля , поэтому при использовании пользовательской формы определения она не будет хранить ваш пароль

  • следуйте инструкциям для расширенной абстрактной базовой модели пользователя

    1. расширяет пользователя, используя
    2. регистрационную форму, используя usercreation форму
    3. Определение вида сохраненных данных
  • следуйте инструкциям для расширения пользователя, используя один к одному

    1. Создайте профиль новой модели и задайте отношение один к одному
    2. Создайте регистрационную форму, используя model.form плюс дополнительные поля, которые вы хотите взять из пользователь определяет в форме класса Explicity
    3. в сохраненной форме и добавляет ссылку на пользователя в модель профиля, используя метод создания

ссылка:

  1. расширенная модель пользователя * 104 2 *
  2. если вы используете форму создания пользователя

go через ссылку, если вы получили ошибку, дайте мне знать

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

Вам необходимо использовать OneToOne Отношения здесь, поскольку у каждого пользователя есть только одна и уникальная информация профиля. поэтому в вашем models.py использовании: -

user                = models.OneToOneField(User, on_delete=models.CASCADE)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...