Как зписать данные в ManyToManyField в Django?
Пишу код по учету средств измерений. При перемещении манометра необходимо обновить объект монтажа. Подскажите как внести изменения в location = models.ManyToManyField выбронного средства измерения, который получаю методом POST из формы.
models.py
class Si(models.Model):
name_si = models.CharField(max_length=100, verbose_name="Наименование СИ")
location = models.ManyToManyField('Location', verbose_name="Место монтажа")
class Location(models.Model):
shop = models.ForeignKey('Shop', on_delete=models.PROTECT, verbose_name="Цех", null=True)
field = models.ForeignKey('Field', on_delete=models.PROTECT, verbose_name="Месторождение", null=True)
object = models.ForeignKey('Object', on_delete=models.PROTECT, verbose_name="Объект", null=True)
forms.py
class UpdateLocationForm(forms.Form):
location = forms.ModelChoiceField(queryset=Location.objects.all(), label="Место монтажа", empty_label="Выбери объект")
views.py
def device(request, device_id):
if request.method =="POST":
form = UpdateLocationForm(request.POST)
if form.is_valid():
print(form.cleaned_data)
Si.objects.filter(pk=device_id)
*.html
<div>
<button class="show-dialog-button" type="button">Изменить место монтажа</button>
</div>
<dialog class="dialog-box">
<form action="" method="POST">
{% csrf_token %}
{{ form.as_p }}
<p><button type="submit"> Изменить </button> </p>
</form>
</dialog>
Можно сделать так
from .models import Si
def device(request, device_id):
if request.method == "POST":
form = UpdateLocationForm(request.POST)
if form.is_valid():
location_selected = form.cleaned_data['location']
si_obj = Si.objects.get(pk=device_id)
# Очищаем предыдущие значения места монтажа для СИ
si_obj.location.clear()
# Добавляем новое значение места монтажа
si_obj.location.add(location_selected)
# Сохраняем изменения
si_obj.save()
# Дополнительная логика / рендеринг шаблона
Отлично. Спасибо! Все оказывается так просто.