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 %}