У объекта 'CustomUser' нет атрибута 'get'
Я пытаюсь автоматически назначить поле ModelForm в качестве ForeignKey из модели, на которой основана ModelForm. Модель включает ForeignKey, который ссылается на CustomUser.
Я хотел бы сделать автоматическое назначение поля ModelForm, чтобы пользователь, вошедший в систему, мог отправить форму и сохранить данные в базе данных. Я продолжаю получать эту ошибку: У объекта 'CustomUser' нет атрибута 'get'. Я не понимаю, что вызывает эту ошибку. Я указал настройки для моего CustomUser и зарегистрировал модели в файлах администратора для каждого приложения. Кроме того, обе модели отображаются в разделе администратора моего проекта, но когда я сохраняю форму для вошедшего пользователя, я получаю эту ошибку и она не сохраняется в базе данных.
Код ниже для справки:
class CustomUserManager(BaseUserManager):
def create_user(self, email, password=None):
if not email:
raise ValueError('Account must have an email address')
user = self.model(
email = self.normalize_email(email),
)
user.set_password(password)
user.save(using=self._db)
return user
def create_superuser(self, email, password):
user = self.create_user(
email = self.normalize_email(email),
password = password,)
user.is_admin = True
user.is_staff = True
user.is_active = True
user.is_superuser = True
user.save(using = self._db)
return user
class CustomUser(AbstractBaseUser, PermissionsMixin):
email = models.EmailField(max_length = 100, unique = True)
first_name = models.CharField(max_length = 50, verbose_name='first name')
last_name = models.CharField(max_length = 50, verbose_name='last name')
date_joined = models.DateTimeField(auto_now_add = True, verbose_name='joined')
last_login = models.DateTimeField(auto_now = True, verbose_name='last login')
is_active = models.BooleanField(default = True)
is_admin = models.BooleanField(default=False)
is_staff = models.BooleanField(default = False)
is_superuser = models.BooleanField(default=False)
objects = CustomUserManager()
USERNAME_FIELD = 'email'
REQIURED_FIELDS = []
def get_user_email(self):
return self.email
def get_user_name(self):
return str(self.first_name) + str(self.last_name)
def has_perm(self, perm, obj = None):
return self.is_admin
def has_module_perms(self, app_label):
return True
Модель:
class FacilityInfo(models.Model):
email = models.ForeignKey(get_user_model(), on_delete = models.CASCADE)
num_facilities = models.PositiveBigIntegerField()
num_one = models.URLField(null = True)
num_two = models.URLField(null = True)
num_one_name = models.CharField(max_length = 50, null = True)
num_two_name = models.CharField(max_length = 50, null = True)
ess_login = models.CharField(max_length= 200, null = True)
ess_pw = models.CharField(max_length= 200, null = True)
Модель формы:
class FacilitySetup(forms.ModelForm):
class Meta:
model = FacilityInfo
fields = ('ess_login','ess_pw','num_one','num_one_name','num_two','num_two_name')
ess_login = forms.CharField(widget=forms.TextInput(
attrs={
"placeholder":"Easy Storage Username",
"class" : "form-control"
}
))
ess_pw = forms.CharField(widget=forms.TextInput(
attrs={
"placeholder":"Easy Storage Password",
"class" : "form-control"
}
))
num_facilities = forms.IntegerField(help_text = "# of Facilities")
num_one = forms.URLField(widget = forms.URLInput(
attrs={
"placeholder":'Facility 1 URL',
'class': "form-control"
}
))
num_one_name = forms.CharField(widget=forms.TextInput(
attrs={
"placeholder":"Facility 1 Name",
"class" : "form-control"
}
))
num_two = forms.URLField(widget = forms.URLInput(
attrs={
"placeholder":'Facility 2 URL',
'class': "form-control"
}
))
num_two_name = forms.CharField(widget=forms.TextInput(
attrs={
"placeholder":"Facility 2 Name",
"class" : "form-control"
}
))
Вид:
@login_required(login_url="/login/")
def facility_info(request):
msg = None
success = False
if request.method == 'POST':
form = FacilitySetup(request.user, request.POST)
if form.is_valid():
obj = form.save(commit=False) # Return an object without saving to the DB
obj.email = request.user # Add an author field which will contain current user's id
obj.save()
msg = 'Facility Info Succesfully Saved'
success = True
else:
msg = "Fields are not valid"
else:
form = FacilitySetup()
return render(request, "facilities/settings.html",{"form": form, "msg":msg, "success":success})
Ошибка возврата:
Environment:
Request Method: POST
Request URL: http://127.0.0.1:8000/facilities
Django Version: 3.2.11
Python Version: 3.9.7
Installed Applications:
['django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'accounts.apps.AccountsConfig',
'home.apps.HomeConfig',
'facilities.apps.FacilitiesConfig']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware']
Traceback (most recent call last):
File "/Users/jack/Desktop/storageapp/lib/python3.9/site-packages/django/core/handlers/exception.py", line 47, in inner
response = get_response(request)
File "/Users/jack/Desktop/storageapp/lib/python3.9/site-packages/django/core/handlers/base.py", line 181, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/Users/jack/Desktop/storageapp/lib/python3.9/site-packages/django/contrib/auth/decorators.py", line 21, in _wrapped_view
return view_func(request, *args, **kwargs)
File "/Users/jack/Desktop/storageapp/storageapp/facilities/views.py", line 26, in facility_info
if form.is_valid():
File "/Users/jack/Desktop/storageapp/lib/python3.9/site-packages/django/forms/forms.py", line 175, in is_valid
return self.is_bound and not self.errors
File "/Users/jack/Desktop/storageapp/lib/python3.9/site-packages/django/forms/forms.py", line 170, in errors
self.full_clean()
File "/Users/jack/Desktop/storageapp/lib/python3.9/site-packages/django/forms/forms.py", line 372, in full_clean
self._clean_fields()
File "/Users/jack/Desktop/storageapp/lib/python3.9/site-packages/django/forms/forms.py", line 384, in _clean_fields
value = field.widget.value_from_datadict(self.data, self.files, self.add_prefix(name))
File "/Users/jack/Desktop/storageapp/lib/python3.9/site-packages/django/forms/widgets.py", line 263, in value_from_datadict
return data.get(name)
File "/Users/jack/Desktop/storageapp/lib/python3.9/site-packages/django/utils/functional.py", line 247, in inner
return func(self._wrapped, *args)
Exception Type: AttributeError at /facilities
Exception Value: 'CustomUser' object has no attribute 'get'
form = FacilitySetup(request.user, request.POST)
Вы передаете request.user своей форме, а также request post. В сигнатуре FacilitySetup указано, что требуется только один аргумент, поэтому я подозреваю, что она рассматривает вашего пользователя как опубликованные результаты формы. Я не вижу, что ваша форма вообще использует request.user, поэтому попробуйте удалить request.user из этой строки.