E
E
Egorian2019-02-09 14:47:25
Django
Egorian, 2019-02-09 14:47:25

Get obj in TabularInline form init?

There are two models : 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)

I want inline messages in the chatroom selection field to display only those rooms in which the currently selected user participates.
To change the options for the chatroom field, I did this:
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()

How can you get the user object in the init method of a form?

Answer the question

In order to leave comments, you need to log in

1 answer(s)
S
Sergey Gornostaev, 2019-02-09
@Egorian

Let's assume that the ChatRoom model has a many-to-many field called 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)

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question