У меня есть две модели, которые связаны отношениями «один ко многим»: активность и пользователи. Пользователь может быть подключен только к 1 действию, но на действие можно ссылаться из нескольких записей пользователя.
// Activity
id | username_id | activity | initial_date | ending_date
-- ------------ -------- ------------ ------------
1 | | test | 2020-01-20 | None
45 | | test45 | 2020-01-25 | None
// User
username_id | email | username | last_login | date_joined |is_admin | is_active | is_staff | is_superuser
------------ ----------------- ---------- ------------ ----------- --------- --- --------------------------------
2 | ab@hotmail.com | ab | 2020-01-20 | 2020-01-15| No | No | No | No
3 | xy@hotmail.com | ab | 2020-01-21 | 2020-01-18| No | No | No | No
//models.py
from django.utils import timezone
from django.contrib.auth import get_user_model
User = get_user_model()
class Activity(models.Model):
id = models.AutoField(primary_key=True)
username_id = models.ForeignKey(User, on_delete=models.CASCADE)
activity = models.CharField(null=False, max_length=140)
initial_date = models.DateField(default=timezone.now(), null=False)
ending_date = models.DateField(default=timezone.now(), null=False)
class User(AbstractBaseUser):
username_id = models.AutoField(primary_key=True)
email = models.EmailField(verbose_name="email", max_length=60, unique=True)
username = models.CharField(max_length=30, unique=True)
last_login = models.DateTimeField(verbose_name='last login', auto_now=True)
date_joined = models.DateTimeField(verbose_name='date joined', auto_now_add=True)
is_admin = models.BooleanField(default=False)
is_active = models.BooleanField(default=True)
is_staff = models.BooleanField(default=False)
is_superuser = models.BooleanField(default=False)
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = ['username']
//forms.py
from .models import Activity
from django import forms
class ActivityModelForm(forms.ModelForm):
model = Activity
fields = ['username_id', 'activity', 'initial_date', 'ending_date']
def __init__(self, *args, **kwargs):
super(ActivityModelForm, self).__init__(*args, **kwargs)
self.fields['username_id'].required = False
self.fields['activity'].required = True
self.fields['initial_date'].required = False
self.fields['ending_date'].required = False
Как видно из таблиц, столбец username_id имеет пустые значения, поэтому я изменил свой код в views.py
при попытке сохранить новое действие, но теперь я сталкиваюсь с ошибкой ValueError: Cannot assign "3": Activity.username" must be a user instance.
def create_activity(request):
form_create = ActivityModelForm(request.POST or None)
username_id = None
if request.user.get_username():
username_id = request.user.id
if form_create.is_valid():
obj = form_create.save(commit=False)
obj.username = username_id
obj.save()
form_create = ActivityModelForm()
template_name = 'activity/formActivity.html'
context = {'form': form_create}
return render(request, template_name, context}