2013-12-15 2 views
0

Peter DeGlopper 작성 :UpdateView에서 M2M 필드를 변경하는 방법은 무엇입니까?

도움을 주셔서 감사합니다. 문제를 해결해 주셔서 감사합니다. 정말 감사하겠습니다. 나는 머리를 테이블에 치고 있었다.

  1. 내 ModelForm을 변경할 필요가 없습니다. checked = "checked" 서브넷이 체크 된대로 출력되고 있지만 브라우저에 체크 표시되지 않았습니다. 이것은 CentOS의 Firefox 24.2.0 (VM에서)에 있었기 때문에 Windows 7 호스트로 이동하여 Firefox 26.0을로드했습니다. IE8에서도 제대로 작동했습니다. 그것은 이상한 일 이었지만 그것이 효과가 있다는 혼란을 설명합니다.

  2. 덕분에 필드를 절약 할 수 있었기 때문에 나는 이제 어떻게 생각하고 있는지 보았습니다. M2M 필드를 업데이트 할 수 있습니다. 작업 코드를 표시하도록 아래 TagUpdateView를 업데이트했습니다.


나는 M2M 필드와 함께 UpdateView를 사용하려고 2 문제가 ...

내 템플릿에 확인으로 현재 "태그"서브넷이 표시 해달라고
  1. 방법 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=forms.CheckboxSelectMultiple()이 아닌 widget=forms.CheckboxSelectMultiple) 사용 하겠지만 왜 영향을 미치는지는 알 수 없습니다.

두 가지 문제 모두 ModelForm부터 시작하여 subnet에 사용자 지정이없고 단지 exclude으로 설정하면 좋은 결과를 얻을 수 있습니다.작동하면 특수보기 코드를 넣어 modified_by을 처리하십시오. 이것이 작동하면 subnet에 대한 사용자 정의 위젯 선언으로 변경하십시오. 처음에는 첫 번째 패스에 대한 사용자 정의 필드 선언이 아닌 meta 위젯 오버라이드 사전을 사용하는 것이 좋습니다.

관련 문제