2013-12-15 97 views
0

由Peter DeGlopper解決:如何更改UpdateView中的M2M字段?

謝謝你的幫助,它解決了我的問題,我真的很感激它。我正把頭撞在桌子上。

  1. 我不必更改我的ModelForm。查看輸入標記中注意到的HTML源代碼checked =「checked」子網被輸出爲已選中,但未在瀏覽器中顯示。這是在CentOS的Firefox 24.2.0(在虛擬機上),所以我去了我的Windows 7主機,並加載了Firefox 26.0的工作,並且在IE8中也能正常工作。這很奇怪,但它解釋了你應該工作的混亂。

  2. 爲了節省字段感謝你我現在看到我是如何思考它。我能夠更新M2M領域。我更新了下面的TagUpdateView以顯示工作代碼。


我有2個問題,試圖使用的UpdateView與M2M領域...

  1. 當前「標記」子網不顯示在我的模板檢查
  2. 如何我是否可以通過覆蓋form_valid來處理更新我的TagUpdateView中的M2M關係?

任何見識將不勝感激。 謝謝。

標籤M2M models.py:

class Tag(models.Model): 
    tag = models.CharField(max_length=120) 
    group = models.ForeignKey(Group) 
    description = models.TextField(max_length=500) 
    subnet = models.ManyToManyField(Subnet, null=True, blank=True) 
    date_created = models.DateTimeField() 
    created_by = models.ForeignKey(User, related_name='tag_created_by') 
    date_modified = models.DateTimeField(auto_now=True) 
    modified_by = models.ForeignKey(User, related_name='tag_modified_by') 

    def __unicode__(self): 
     return self.tag 

標籤的ModelForm:

class TagForm(forms.ModelForm): 

    subnet = forms.ModelMultipleChoiceField(widget=forms.CheckboxSelectMultiple(), required=True, queryset=Subnet.objects.all()) 

    class Meta: 
     model = Tag 
     exclude = ('date_created', 'created_by', 'date_modified', 'modified_by') 

標籤views.py:

class TagUpdateView(UpdateView): 
    template_name = 'tag_update.html' 
    model = Tag 
    form_class = TagForm 

    def form_valid(self, form): 

     update_tag = form.save(commit=False) 

     update_tag.modified_by = self.request.user 

     update_tag.save() 

     form.save_m2m() 

     return super(TagUpdateView, self).form_valid(form) 

我的模板 「tag_update.html」:

{% extends 'base.html' %} 
{% load widget_tweaks %} 

{% block title %}Tag {{ object.tag }} Update{% endblock %} 

{% block content %} 
    <h1>Tag {{ object.tag }} Update</h1> 
    <br /> 
    <form action="" method="post" role="form">{% csrf_token %} 
     <div class="row"> 
      <div class="col-sm-4"> 
       <div class="form-group"> 
        <label for="id_tag">Tag Name</label> 
        {% render_field form.tag placeholder=form.tag.label class="form-control" %} 
       </div> 
      </div> 
     </div> 
     <div class="row"> 
      <div class="col-sm-2"> 
       <div class="form-group"> 
        <label for="id_group">Group</label> 
        {% render_field form.group placeholder=form.group.label class="form-control"%} 
       </div> 
      </div> 
     </div> 
     <div class="row"> 
      <div class="col-sm-6"> 
       <div class="form-group"> 
        <label for="id_description">Description</label> 
        {% render_field form.description placeholder=form.description.label class="form-control" rows="5" %} 
       </div> 
      </div> 
     </div> 
     <div class="row"> 
      <div class="col-sm-6"> 
       <div class="form-group"> 
        <label for="id_checkbox">Link to Subnets</label> 
        {{ form.subnet }} 
       </div> 
      </div> 
     </div> 
     <br /> 
     <button type="submit" class="btn btn-primary">Submit</button> 
    </form> 
    <br /> 
{% endblock %} 

回答

1

你在推翻它。如果您需要跟蹤關係模型本身的信息(例如創建特定子網/標記對時的修改時間戳),但對於您在此顯示的模型關係,處理這種關係可能有點複雜,form.save_m2m()是足夠的 - 它爲你處理m2m關係。

如果您不需要在初始表格中使用commit=False保存,您甚至不需要這樣保存,因此您可以設置modified_by字段。

對於預填充 - 大多數情況下,我認爲它應該遵循正常行爲並預先填充。我可能只是使用widget類而不是明確地實例化它(widget=forms.CheckboxSelectMultiple而不是widget=forms.CheckboxSelectMultiple()),但我不明白爲什麼會影響它。

對於這兩個問題,您可能會得到良好的結果,以簡單的ModelForm開頭,subnet上只有exclude沒有自定義設置。一旦工作,請輸入特殊視圖代碼來處理modified_by。一旦工作,更改爲subnet的自定義窗口小部件聲明 - 可能最初使用meta窗口小部件重寫字典而不是第一次傳遞的自定義字段聲明。