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)
Вернуться на верх