0

我有一个模型,其中包含要使用 createview 编辑的多对多字段(我的 Activity 模型中的参与者字段,见下文)。但是,我只能从现有条目中进行选择,而不能创建新条目。可以在管理站点中执行此操作,因此有一个解决方案,但我无法弄清楚。我试图在视图中修改 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)

模型.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',)

表格.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 %}
4

0 回答 0