Отправить значение select из шаблона в форму django
У меня есть модель группы:
class Group(models.Model):
leader = models.ForeignKey(User, on_delete=models.CASCADE)
name = models.CharField(max_length=55)
description = models.TextField()
joined = models.ManyToManyField(User, blank=True)
и форма для обновления указанной группы:
class UpdateGroup(UpdateView):
model = Group
form_class = UpdateGroupForm
template_name = 'update_group.html'
def form_valid(self, form):
group = form.save()
return HttpResponseRedirect(reverse('user_detail', args=[str(group.pk)]))
Я хочу, чтобы leader
группы имел возможность передать свое лидерство другому члену, имеющему joined
. В моем шаблоне UpdateUser у меня есть две кнопки:
<form method="POST">
{% csrf_token %}
{{form.as_p}}
<button type="submit" name="update">UPDATE</button>
<select>
{% for member in group.joined.all %}
{% if member != group.leader%}
<option value={{ member }}>{{ member }}</option>
{% endif %}
{% endfor %}
</select>
<button type="submit" name="change_leader">CHANGE LEADER</button>
</form>
Фронтенд работает здесь, и он отображается так, как я хочу, единственная проблема теперь в том, как мне отправить обновление для группы с помощью кнопки UPDATE
и только для leader
группы с помощью кнопки CHANGE LEADER
?
Нужны ли мне две разные формы? Я бы хотел, чтобы кнопка CHANGE LEADER
обновляла форму и возвращала в представление GroupDetail, но только если эта кнопка нажата. То есть, если по ошибке лидер нажал одну из кнопок <option value={{ member }}>{{ member }}</option>
, но нажал UPDATE
вместо CHANGE LEADER
, лидер группы не будет изменен.
В итоге я пошел совершенно другим путем. Добавил новое представление, форму и url для смены лидера группы. Затем в шаблоне change_leader.html
я сделал следующее:
<form method="POST">
{% csrf_token %}
{{form.as_p}}
<select id="newLeaderSelect">
{% for member in group.joined.all %}
{% if member != group.leader%}
<option id='newLeader' value={{ member.id }}>{{ member }}</option>
{% endif %}
{% endfor %}
</select>
<button>CHANGE LEADER</button>
{{form.errors}}
</form>
<script>
let leader = document.getElementById('leader')
let newLeaderSelect = document.getElementById('newLeaderSelect')
leader.value = newLeaderSelect.value
newLeaderSelect.onchange = () => {
leader.value = newLeaderSelect.value
}
</script>
Это сработало отлично, но если кто-то знает, как сделать так, чтобы обе формы были на одной форме, не стесняйтесь опубликовать ответ.