2017-09-05 26 views
1

我正在为一个添加和编辑团队和志愿者的应用程序创建一组视图。志愿者可以按照自己的意愿参加尽可能多的团队,其中一些团队成为团队领导者。由于需要流程的灵活性(我猜),我已经将两个项目分开了(尽管我愿意接受这方面的建议!),并且我试图设置视图的一致性。例如,我想确保每次我在一个视图中添加一个组长时,他们也会被注册为一个组员。当我将()添加到ManyToMany关系时,它是否取代以前的记录?

class Team(models.Model): 
    team_name = models.CharField(max_length=30, null=True, blank=True) 
    leaders = models.ManyToManyField(Volunteer, related_name='leaders', blank=True) 
    enrolled = models.ManyToManyField(Volunteer, related_name='enrolled', blank=True) 

class Volunteer(models.Model): 
    name = models.CharField(max_length=30) 

我有一个观点,我正在做这个。保存表格后,我将每个leaders并将它们添加到enrolled字段。但是,当我添加它们时,我发现在该字段上注册的以前的值已被我添加的新值所取代。我可以将以前的值保存在一个变量中并重新应用,但是它应该以这种方式工作吗?

class TeamUpdate(LoginRequiredMixin, UpdateView): 
form_class = TeamCreateForm 
model = Team 
def form_valid(self, form): 
    self.object = form.save() 
    for i in self.object.leaders.all(): 
     self.object.enrolled.add(i) 
    return HttpResponseRedirect(reverse('single', args=(self.object.id,))) 

你能指点我的方向吗?

编辑:添加表单和模板。前者显示模型中的所有实际字段(为了简化它,我减少了它们,但如果您愿意,我可以将它们全部发布)。

class TeamCreateForm(forms.ModelForm): 
    class Meta: 
     model = Team 
     template_name = 'team_form.html' 
     fields = '__all__' 

模板:

{% extends "base.html" %} 
{% block title %}Add or edit team{% endblock %} 

{% block content %} 

<div class="container"> 
    <div class="container"> 
    <h1 class="blue-text">add or edit team</h1> 
    <form class="registration" action="" method="post">{% csrf_token %} 
     {% csrf_token %} 
     <div class="white row z-depth-1"> 
      <small class="red-text">{{ form.non_field_errors }}</small> 
      <div class="col s9"> 
      <label for="id_name">Team Name</label>{{ form.team_name }} 
      <small class="error brick-text">{{ form.team_name.errors }}</small> 
      </div> 
      <div class="col s12"> 
      <label for="id_name">Team Leaders</label>{{ form.leaders }} 
      <small class="error brick-text">{{ form.leaders.errors }}</small> 
      </div> 
      <a class="waves-effect waves-light btn-large blue" onClick="$(this).closest('form').submit();">Save</a> 
     </div> 
    </form> 
    </div> 
</div> 
{% endblock %} 
+0

添加不应取代现有的关系。你如何检查登记的价值? – arjun27

+0

你可以显示'TeamCreateForm'吗? – knbk

+0

@knbk已添加。你可以看到它是一个非常标准的ModelForm。 –

回答

0

你的HTML表单不包括enrolled场,但您的ModelForm不包括它。由于ModelForm在enrolled字段中未收到任何数据,因此它会假定您明确移除了所有选定的志愿者并将其删除。

你需要明确定义哪些字段是您的ModelForm:

class TeamCreateForm(forms.ModelForm): 
    class Meta: 
     model = Team 
     template_name = 'team_form.html' 
     fields = ['team_name', 'leaders'] 

建议始终明确命名的字段,而不是使用__all__。如果你不这样做,并且你添加了一个不应该被用户编辑的字段,它可能会成为一个安全问题。

+0

你已经说出了真相。这是问题。非常感谢你! –

相关问题