Egorian
@Egorian

Получить obj в init формы TabularInline?

Есть две модели : User, Message
class Message(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL,on_delete=models.CASCADE)
    content = models.CharField(max_length=5000)
    chat_room = models.ForeignKey(ChatRoom,on_delete=models.CASCADE)

class User(AbstractUser):
    about = models.CharField(max_length=1000, default="",blank=True)
    first_name = models.CharField(_('first name'), max_length=30, blank=False)
    last_name = models.CharField(_('last name'), max_length=150, blank=False)
    email = models.EmailField(_('email address'), blank=False)

admin.py
class MessageAdminForm(ModelForm):
    class Meta:
        model = Message
        fields = ('chat_room','content')

class MessageInline(admin.TabularInline):
    form = MessageAdminForm
    model = Message

class UserAdmin(admin.ModelAdmin):
    inlines = [MessageInline]

admin.site.register(User)

Я хочу чтобы в инлайне сообщения в поле выбора chatroom отображались только те комнаты в которых участвует текущий выбранный пользователь
Чтобы изменить варианты поля chatroom я сделал так:
class MessageAdminForm(ModelForm):
    class Meta:
        model = Message
        fields = ('chat_room','content')
        def __init__(self, *args, **kwargs):
           super().__init__(*args, **kwargs)
           if self.instance:
            self.fields['chat_room'].queryset = User.objects.get(pk=?????.id).chatroom_set.all()

Как в init методе формы можно получить объект пользователя?
  • Вопрос задан
  • 154 просмотра
Решения вопроса 1
sergey-gornostaev
@sergey-gornostaev Куратор тега Django
Седой и строгий
Предположу, что в модели ChatRoom есть many-to-many поле с именем users:
from django.urls import resolve

class MessageInline(admin.TabularInline):
    model = Message

    def get_user(self, request):
        resolved = resolve(request.path_info)
        if resolved.args:
             return self.parent_model.objects.get(pk=resolved.args[0])
        return None

    def formfield_for_foreignkey(self, db_field, request, **kwargs):
        if db_field.name == "chat_room":
            user = self.get_user(request)
            if user:
                kwargs["queryset"] = ChatRoom.objects.filter(users=user)
        return super().formfield_for_foreignkey(db_field, request, **kwargs)
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы