У меня есть веб-приложение для управления событиями с группой и тегами, как указано ниже:
# model.py
class Event(models.Model):
name = models.CharField('Event Name', max_length=100, help_text='Insert a name for the event')
tags = models.ManyToManyField('Tag')
group = models.ForeignKey('Group', on_delete=models.SET_NULL, null=True)
class Group(models.Model):
name = models.CharField('Group name', max_length=50, help_text='Insert a name for the group')
description = models.CharField('Description', max_length=100, help_text='Insert a description for the group (optional)', blank=True)
class Meta:
verbose_name_plural = "Groups"
ordering = ['name']
def __str__(self):
return self.name
class Tag(models.Model):
name = models.CharField('Tag name', max_length=50, help_text='Insert a name for the Tag')
group = models.ForeignKey('Group', on_delete=models.SET_NULL, null=True)
class Meta:
ordering = ['name']
# to avoid accepting a tag with the same value & group
unique_together = ['name', 'group']
def __str__(self):
return self.name
Я хочу иметь теги поля, связанные с выбранным значением группа .Для этого я черпал вдохновение из этих обсуждений: - https://stackoverflow.com/a/48608535 - https://stackoverflow.com/a/47843768
Поэтому я переопределяю свой change_form.html :
{% extends 'admin/change_form.html' %}
{% block admin_change_form_document_ready %}
{{ block.super }}
<script src="https://code.jquery.com/jquery-2.1.1.min.js" type="text/javascript"></script>
<link href="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.1/css/select2.min.css" rel="stylesheet"/>
<script src="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.1/js/select2.min.js"></script>
<script type="text/javascript">
var url = 'myUrl';
getRelatedTags(url);
/* get tags related to a group */
function getRelatedTags(url)
{
// initiate select2
$("#id_tags").select2({});
// make initial call to populate tags related to group
$.getJSON(url, {id: $('select#id_group').val()}, function(j){
var options = '';
for (var i = 0; i < j.length; i++) {
options += '<option value="' + j[i].id + '">' + j[i].name + '</option>';
}
// inspect html to check id of subcategory select dropdown.
$("select#id_tags").html(options);
});
//$(document).on('change', "select#id_group", function()
// bind load + change simultaneously
$('select#id_group').bind('change', function ()
{
$("#id_tags").select2("val", "");
if($(this).val())
{
group_id = $(this).val();
}
else
group_id = 0;
$.getJSON(url, {id: group_id}, function(j){
var options = '';
for (var i = 0; i < j.length; i++) {
options += '<option value="' + j[i].id + '">' + j[i].name + '</option>';
}
// inspect html to check id of subcategory select dropdown.
$("select#id_tags").html(options);
});
});
$('select#id_group').trigger('change');
}
</script>
{% endblock %}
И это код views :
def get_related_tags_to_group(request):
if request.is_ajax():
group_id = request.GET.get('id','')
result = list(Tag.objects.filter(group__id=int(group_id)).values('id', 'name'))
else:
result = {}
return HttpResponse(json.dumps(result), content_type="application/json")
Проблема возникает, когда я добавляю новый тег, нажимая значок + (в представлении администратора): после ввода нового 'tag 'value, select2 не обновляется, но он вставляется в список select2-results> ul.select2-id_tags-results