Создайте новую модель в 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): работал
Я не уверен, что это лучшее решение для моей проблемы, хотя