Django, панель администратора, зависимость значений одного поля ForeignKey, доступных для выбора, от значения, выбранного в другом поле ForeignKey

У меня есть модели:

models.py

class CommentCollection(models.Model):
      name = models.CharField(max_length=50)


class Comment(models.Model):
      comments_collection = models.ForeignKey(CommentCollection, related_name='comments', on_delete=models.CASCADE)
      reply_to = models.ForeignKey('self', related_name='replies', null=True, blank=True, on_delete=models.CASCADE)
      text = models.TextField()
      user = models.ForeignKey(User, related_name='user_comments', on_delete=models.CASCADE)
      created = models.DateTimeField(auto_now_add=True)
      is_public = models.BooleanField(default=False, verbose_name='Published')

<admin.py>

@admin.register(CommentCollection)
class CommentCollectionAdmin(admin.ModelAdmin):
      list_display = ['id', 'name']

Как сделать так, чтобы: При добавлении нового комментария через админпанель, после заполнения поля "comments_collection" (выбор из модели CommentCollection), в поле reply_to для выбора отображались только те комментарии, которые принадлежат к той же коллекции комментариев.

@admin.register(Comment)
class CommentAdmin(admin.ModelAdmin):
      list_display = ('comments_collection', 'user', 'created', 'is_public')

добавьте приведенный ниже код к вашему CommentAdmin. Когда вы делаете модификацию, нет необходимости в JS, но для добавления новой опции, вам нужно передать данные из FE в BE. Я не уверен, что часть добавления будет работать, но вы можете получить представление...

def render_change_form(self, request, context, add, change, form_url, obj):
    if add:
        collection_id = (
            request.GET.get("comment_collection")
            if request.GET.get("comment_collection")
            else -1
        )
    if change:
        collection_id = obj.comments_collection.id
    reply_to_qs = context["adminform"].form.fields["reply_to"].queryset

    context["adminform"].form.fields["reply_to"].queryset = reply_to_qs.filter(
        comments_collection_id=collection_id
    )
    return super().render_change_form(request, context, add, change, form_url, obj)

создайте файл в этом месте, для более подробной информации обратитесь к документу django doc.

project/app_name/templates/admin/app_name/change_form.html

{% extends "admin/change_form.html" %}
{% load admin_urls static admin_modify %}  
{% block footer %}

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js"></script>
<script>
    commentSelection = document.getElementById("id_comments_collection")
    commentSelection.onchange = function() {
            $.ajax({
                type: 'GET',
                url: "{% url 'admin:app_name_comment_add' %}",
                data: {"comment_collection": commentSelection.value},
                success: function (response) {
                    console.log(commentSelection.value);
                },
                error: function (response) {
                    console.log(response)
                }
            })
    }
</script>
{% endblock %}
Вернуться на верх