Django Admin: исходные данные при добавлении связанного объекта
Здравствуйте, я столкнулся с проблемой при попытке добавить новый объект через django admin в модель, которая имеет ссылку на другую модель. Обычно эта проблема не возникает, но я использую метод get_initial_for_field.
в моем admin.py у меня есть:
@admin.register(UserProfile)
class UserProfileAdmin(UserProfileExportMixin, admin.ModelAdmin):
list_display = ('user', 'attrs', 'invited_by')
form = UserProfileForm
и модель UserProfile имеет ссылку на django.contrib.auth.models.User.
Моя UserProfileForm выглядит так:
class UserProfileForm(forms.ModelForm):
is_active = forms.BooleanField(required=False)
class Meta:
model = UserProfile
exclude = ["id", ]
fields = ["user", "invited_by", "avatar", "attrs", "phone_number", "is_active"]
def get_initial_for_field(self, field, field_name):
obj = super().save(commit=False)
field_value = obj.user.is_active
if field_name == "is_active":
field.initial = field_value
return super(UserProfileForm, self).get_initial_for_field(field, field_name)
Когда я пытаюсь посмотреть/изменить существующий UserProfile, то проблем нет, так как ссылка на пользователя установлена, но когда я пытаюсь добавить новый профиль пользователя, то получаю RelatedObjectDoesNotExist. UserProfile has no user.
Я пытался проверить, существует ли пользователь:
obj = super().save(commit=False)
field_value = True
if obj.user is not None:
field_value = obj.user.is_active
if field_name == "is_active":
field.initial = field_value
но это не сработало. Может кто-нибудь подсказать мне, как решить эту проблему?
Этот код obj = super().save(commit=False) создает объект UserProfile, а не объект User. если вы хотите использовать пользователя, вы должны создать объект User и добавить его в объект UserProfile, затем сохранить его.
Другой способ заключается в использовании этого способа для извлечения информации о пользователе запроса (request.user).
добавьте это в UserProfileForm и посмотрите, все ли в порядке?
def __init__(self, *args, **kwargs) -> None:
self.request = kwargs.pop("request")
и перезаписать метод как этот
if field_name == "is_active":
field.initial = self.request.user.is_active
return super(UserProfileForm, self).get_initial_for_field(field, field_name)