Создайте новую модель в Django, связанную с таблицей User

Я новичок в Django и я правильно создал свое первое веб-приложение, где я могу зарегистрироваться и войти как пользователь. Я использую стандартные from django.contrib.auth.models import User и UserCreationForm для управления этой штукой.

Теперь я хочу создать новую таблицу в базе данных, чтобы добавить новые поля для пользователя. Я уже использую стандартные поля, такие как email, имя, фамилия, второе имя, email, имя пользователя и т.д., но я хотел бы расширить их, добавив возможность хранения последнего времени изменения email и другой информации. Вся эта информация не добавляется через форму, а вычисляется бэкендом (например, каждый раз, когда я хочу изменить свой email в профиле, относительное поле в моей новой таблице, связанной с профилем, меняет значение)

Для этого я добавил в файл models.py текущий код

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


class UserAddInformation(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    last_time_email_change = models.TimeField('Last email changed', auto_now_add=True, blank=True)

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

И на моем admin.py

from django.contrib import admin
from .models import UserAddInformation

admin.site.register(UserAddInformation)

Форму для редактирования письма и представления можно найти ниже

forms.py

class EditUserForm(UserChangeForm):
    password = None

    email = forms.EmailField(widget=forms.EmailInput(attrs={
        'class': 'form-control'
    }))

    class Meta:
        model = User

        # select the fields that you want to display
        fields = ('email',)

views.py

@authenticated_user
def account_user(request):
    if request.method == "POST":
        form = EditUserForm(request.POST, instance=request.user)
        if form.is_valid():
            form.save()
            user_info_obj = UserAddInformation.objects.create(user=request.user,
                                                              last_time_email_change=datetime.now())
            user_info_obj.save()
            messages.success(request, "Edit Succesfully")
        else:
            pass
    else:
        form = EditUserForm()
    return render(request, 'authenticate/account.html', {
        'form_edit': form,
    })

Проблема в том, что когда я собираюсь обновить email через форму, я получаю ошибку UNIQUE constraint failed: members_useraddinformation.user_id

Процесс редактирования электронной почты работает

Что я делаю не так?

Оказалось, что auto_now_add=True наследует editable=False, порождая ошибку. Поэтому, изменив мой models.py на

class UserAddInformation(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    last_time_email_change = models.TimeField('Last email changed')

    def save(self, *args, **kwargs):
        self.last_time_email_change = timezone.now()
        return super(UserAddInformation, self).save(*args, **kwargs)

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

и проверка с помощью

user_info_obj = UserAddInformation.objects.get_or_create(user=request.user)
user_info_obj[0].save()

внутри def account_user(request): работал

Я не уверен, что это лучшее решение для моей проблемы, хотя

Вернуться на верх