У меня есть модель с полем «многие ко многим» (поле участника в моей модели «Активность», см. Ниже), которую я хочу отредактировать с помощью createview. Однако я могу только выбирать из уже существующих записей, а не создавать новые. Это можно сделать на сайте администратора, так что есть решение, но я не могу понять это. Я пытался изменить form_valid в представлениях, но безуспешно. Любые идеи, как добавить или изменить поле, которое имеет отношение многие ко многим?
views.py:
#response=super(CreateTour,self).form_valid()
#self.object.project=self.form.cleaned_data['participant']
class CreateTour(CreateView):
form_class=CreateTourForm
template_name='artdb/createtour.html'
def get_context_data(self,**kwargs):
context=super(CreateTour,self).get_context_data(**kwargs)
context['formset']=CreateFormset()
return context
def form_valid(self,form):
self.object=form.save(commit=False)
for p in form.cleaned.data['participant']:
ap=Person()
ap.group=self.object
ap.person=ap
ap.save()
return super(self).form_valid(form)
models.py:
class Activity(models.Model):
activity_name=models.CharField(max_length=200,default='no name')
project=models.ForeignKey(Project,on_delete=models.CASCADE,default=1)
participant=models.ManyToManyField(Person)
min_stage_area=models.IntegerField(default='2')
light_requirements=models.CharField(max_length=200,default='no requirements')
sound_engineer=models.CharField(max_length=200,default='not needed')
comment=models.ManyToManyField(Comment)
def __str__(self):
return self.activity_name
class Meta:
ordering = ('activity_name',)
forms.py:
class CreateTourForm(ModelForm):
class Meta:
model=Activity
fields=('activity_name','project','participant')
widgets={'participant':CheckboxSelectMultiple,}
CreateFormset=modelformset_factory(
Activity,
fields=['activity_name','participant'],
extra=1,
widgets={
'date':DateInput(attrs={'type': 'date'}),
}
)
шаблон:
{% extends "artdb/index.html" %}
{% block ct %}
<form method="post">{% csrf_token %}
<div class="input-group">
{% for fr in formset %}
{{fr}}
{% endfor %}
<a>
{{form}}
</a>
<div class="input-group-append">
<button class="btn btn-success add-form-row">+</button>
</div>
</div>
<hr></hr>
<div class="row spacer">
<input type="submit" value="save">
</div>
</form>
{% endblock ct %}