如何修改django中具有多对多关系的现有字段?

如何修改django中具有多对多关系的现有字段?,django,model,many-to-many,edit,create-view,Django,Model,Many To Many,Edit,Create View,我有一个模型,其中有一个多对多字段(我的活动模型中的参与者字段,见下文),我想使用createview编辑该字段。但是,我只能从现有条目中进行选择,不能创建新条目。这是可以做到的,在管理网站,所以有一个解决方案,但我不能想出它。我试图修改视图中有效的表单,但没有成功。如何添加或修改具有多对多关系的字段 views.py: #response=super(CreateTour,self).form_valid() #self.object.project=self.form

我有一个模型,其中有一个多对多字段(我的活动模型中的参与者字段,见下文),我想使用createview编辑该字段。但是,我只能从现有条目中进行选择,不能创建新条目。这是可以做到的,在管理网站,所以有一个解决方案,但我不能想出它。我试图修改视图中有效的表单,但没有成功。如何添加或修改具有多对多关系的字段

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 %}
{%extensed“artdb/index.html”%}
{%block ct%}
{%csrf_令牌%}
{formset%中fr的%
{{fr}}
{%endfor%}
{{form}}
+

{%endblock ct%}
如果要添加直接在“创建巡更”页面中创建新的
人物
对象的功能,请使用。这将允许您创建多个
Person
对象,并且在您的视图中,您需要将它们添加到教程中。好的,我测试了添加模型表单集,请参见edited forms.py,但它只提供了已添加人员的下拉选项,无法添加人员。我缺少什么?但是表单集的模型应该是
Person
而不是
Activity
,因为您要创建一个新的
Person
。此外,在您的视图中,您将同时处理
活动表单
和表单集。一个
CreateView
generic CBV不是一个很好的混合方法,请编写一个基于函数的视图。好的,我会加入其中。让我印象深刻的是,在django这样的db驱动的web框架中,更新m2m字段应该是一项非常常见的任务,但是很难获得有关它的任何信息。