Как изменить существующие поля в django, которые имеют отношение многие ко многим? - PullRequest
0 голосов
/ 24 февраля 2020

У меня есть модель с полем «многие ко многим» (поле участника в моей модели «Активность», см. Ниже), которую я хочу отредактировать с помощью 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 %}
...