2017-09-05 24 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

你已經說出了真相。這是問題。非常感謝你! –

相關問題