2013-05-02 6 views
1

DIY 애플리케이션 (Django 1.5)을 작업 중이며로드 블록에 도달했습니다. 관련된 주요 모델은 Guide, Tool, Item, Step입니다. 가이드는 많은 도구 및 항목을 가질 수 있으며 도구 또는 항목은 많은 가이드에 속할 수 있습니다. 한 단계에 대해서도 마찬가지입니다. 많은 도구와 항목을 가질 수 있으며 도구 나 항목은 많은 단계에 속할 수 있습니다. 가이드에는 많은 단계가 있고 단계는 가이드에 속합니다.Django ModelMultipleChoiceField 다른 모델의 many-to-many

가이드 대다 항목

가이드 대다 도구

가이드 일대 단계

단계 many-to-many 항목

단계 대다 도구

로드 블록 ... 가이드 수준에서

, 나는 도구 및 항목 옵션은 무한되고 싶어요. 그러나 스텝 - 레벨에서 툴과 아이템 옵션은 그것이 속한 가이드에 할당 된 옵션으로 제한되기를 바랍니다. 기본적으로 스텝을 생성/편집 할 때 가이드를 통해 사용할 수있는 모든 도구 및 항목에 대한 체크 박스를 나열하고 싶습니다. 사용자는 현재 단계에 필요한 것을 선택합니다. 각 단계에는 도구와 항목의 다양한 조합이 있습니다 (따라서 확인란의 필요성).

Step의 ModelForm 클래스에 대해 ModelMultipleChoiceField을 발견했습니다. 거기서는 쿼리 세트를 지정할 수 있습니다. 그러나 가이드 모델의 인스턴스에 액세스하여 선택 항목을 제대로 만들 수 있도록 도구 및 항목을 검색하려면 어떻게해야합니까? 나는 당신이보기에서하는 것과 유사한 쿼리를 제공하고자은 ...

Guide.objects.get(pk=n).tools.all() 
Guide.objects.get(pk=n).items.all() 

어떻게 ModelMultipleChoiceField를 통해 것을 달성 할 수 있는가? 나는 이것을 분명히 설명 할 수 있었으면 좋겠다.

미리 도움을 청하십시오.

편집
class Tool(models.Model): 
    name = models.CharField(max_length=100) 
    ... 


class Item(models.Model): 
    name = models.CharField(max_length=100) 
    ... 


class Guide(models.Model): 
    models.CharField(max_length=100) 
    description = models.CharField(max_length=500) 
    tools = models.ManyToManyField(Tool, null=True, blank=True) 
    items = models.ManyToManyField(Item, null=True, blank=True) 
    ... 


class Step(models.Model): 
    title = models.CharField(max_length=100) 
    body = models.TextField() 
    guide = models.ForeignKey(Guide) 
    tools = models.ManyToManyField(Tool, null=True, blank=True) 
    items = models.ManyToManyField(Item, null=True, blank=True) 

: 나는 나 같은 self.instance.guide.tools.all()을 내 쿼리를 만들 수 있도록, 내가 self.instance에 대한 참조를 얻을 ModelMultipleChoiceField__init__ 메소드를 오버라이드 (override) 할 필요와 같은 추가 읽기 후 5/2 , 그것은 보인다 self.instance.guide.items.all(). 그런 다음 fields['field_name']을 통해 필드를 만듭니다.

저는 지금 일하고 있습니다. 그래서 오늘 밤 늦게까지이 문제를 해결할 수 없습니다. 내 조사 결과를 다시보고하겠습니다.

+0

다니엘, 당신은 아마, 질문에 대한 답을 작성해야합니다. –

+1

예, 알림을 보내 주셔서 감사합니다! 몇 가지 작업을 수행합니다. –

답변

0

내가 한 일은 다음과 같습니다. ModelMultipleChoiceField을 만들기위한 ModelForm 클래스의 메서드를 정의했습니다.그 이유는 단계 작성 페이지를 요청할 시점에 단계와 연관된 안내서가 없기 때.입니다 (POST ... 검증이 성공했다고 가정 할 때까지). 하지만 가이드의 슬러그 필드에 액세스하여 단계가 생성됩니다. 나는 URL에서 얻을 경우. 그리고 슬러그 필드는 내 앱에서 고유합니다. 그래서 나는 내가 만든 새로운 방법을 통해 내 관점에서 슬러그를 양식으로 전달합니다. 거기에서 가이드에 할당 된 도구를 가져 와서 내 서식 파일에서 해당 옵션을 양식에 사용할 수있게했습니다. 당신이 당신의 목표를 달성에 성공한다면

forms.py

class NewStepForm(forms.ModelForm): 
    ... 
    def create_tools_field(self, slug): 
     self.fields['tools'] = forms.ModelMultipleChoiceField(
      queryset=Guide.objects.get(slug=slug).tools.all(), 
      widget=forms.CheckboxSelectMultiple(attrs={'class': 'unstyled'}) 
     ) 
    ... 

views.py

class NewStepView(View): 

    form_class = NewStepForm 
    initial = {'key': 'value'} 
    template_name = "guides/guide_step_new.html" 

    @method_decorator(login_required) 
    def dispatch(self, *args, **kwargs): 
     return super(NewStepView, self).dispatch(*args, **kwargs) 

    def get(self, request, *args, **kwargs): 
     slug = kwargs.get('slug') 
     form = self.form_class(initial=self.initial) 
     form.create_tools_field(slug) 
     return render(request, self.template_name, {'form': form})