2017-10-17 4 views
7

여러 인스턴스에서 사용할 수있는 장고 앱이 있습니다. 하나의 모델 (Listing)은 다양한 인스턴스에 대해 다양한 수의 필드를 가질 수 있지만 인스턴스의 추가 필드는 항상 정확히 동일합니다. 나는이 같은 관리를 통해 내가 만든 모델을 추가 한 다음 추가 필드를 원하는 :다른 레코드의 필드 내용이 레이블로 Django 템플릿에 알 수없는 필드를 표시합니다.

class BespokeField (models.Model): 
    name = models.CharField(
     max_length = 20, 
     verbose_name = "Field Title" 
    ) 

    def __unicode__(self): 
     return self.name 

class Listing (models.Model): 
    name = models.CharField (
     verbose_name = 'Listing', 
     max_length = 30 
    ) 
    slug = models.SlugField (
     verbose_name = "Slug", 
     allow_unicode = True, 
     unique=True, 
     blank=True, 
     null=True 
    ) 

class ListingBespokeField (models.Model): 
    bespoke_field = models.ForeignKey(BespokeField) 
    listing = models.ForeignKey(Listing) 
    value = models.CharField (
     max_length = 60 
    ) 

    def __unicode__(self): 
     return u'%s | %s' % (self.listing.name, self.bespoke_field.name) 

이론은 관리자가 맞춤 필드를 지정하고이 다음이다 형태로 사용자에게 표시합니다.

class ListingBespokeFieldInline(admin.TabularInline): 
    model = ListingBespokeField 
    extra = len(BespokeField.objects.all()) 
    max_num = len(BespokeField.objects.all()) 

class ListingAdmin(admin.ModelAdmin): 
    inlines = [ListingBespokeFieldInline] 

그것은 관리자 사용자가 드롭 다운에서 각 BespokeField 중 하나를 선택하는 것을 의미하지만 않습니다 내 admin.py의 모습, 그래서 나는 사용자의 정보에 소량을 가정 할 수있는 관리자 내에서이 비교적 간단 왜냐하면 unique_together를 사용하면 각각 하나만 존재하기 때문에 불편하지 않습니다.

내가 할 수없는 방법은 관리자가 아닌 사용자에게 친절한 방법으로 이것을 제공하는 것입니다. 내가 원하는 것은 ListingBespokeField.value에 대한 레이블로 양식에 BespokeField.name을 표시하는 것입니다.

여기는 forms.py (ListingBespokeField)입니다.

class ListingBespokeFieldInline(forms.ModelForm): 
    class Meta: 
     model = ListingBespokeField 
     exclude =['id'] 
     widgets = { 
      'bespoke_field' : forms.HiddenInput(), 
      'value' : forms.TextInput(attrs={'class' : 'form-control'}) 
     } 

class ListingBespokeFieldForm(forms.ModelForm): 
    class Meta: 
     model = ListingBespokeField 
     exclude =() 

BESPOKE_FIELD_COUNT = len(BespokeField.objects.all()) 

ListingBespokeFieldInlineFormSet = forms.inlineformset_factory (
    Listing, 
    ListingBespokeField, 
    form=ListingBespokeFieldInline, 
    extra = BESPOKE_FIELD_COUNT, 
    max_num = BESPOKE_FIELD_COUNT, 
    exclude = ['id'], 
    can_delete=False, 
    can_order=False 
) 

I는 다음과 같이 템플릿을 통해 그것을 제공하기 위해 노력하고있어 :이 작동하지 않습니다

<table class="table"> 
    {{ bespokefields.management_form }} 

    {% for form in bespokefields.forms %} 
     {% if forloop.first %} 
     <thead> 
      <tr> 
       {% for field in form.visible_fields %} 
        <th>{{ field.label|capfirst }}</th> 
       {% endfor %} 
      </tr> 
     </thead> 
     {% endif %} 
     <tr class="formset_row bespokefield"> 
      <td> 
       {{ form.listing }}{{ form.id }}{{ form.bespoke_field }} 
       {{ form.bespoke_field.label }} 
      </td> 
      <td>{{ form.value }}</td> 
     </tr> 
    {% endfor %} 
</table> 

. 나는 약간 통찰력을 사용할 수 있었다.

<table class="table"> 
    {{ bespokefields.management_form }} 

    {% for form in bespokefields.forms %} 
     <tr class="formset_row bespokefield"> 
      <td> 
       {{ form.listing }}{{ form.id }} 
       <select id="id_listingbespokefield_set-{{ forloop.counter0 }}-bespoke_field" name="listingbespokefield_set-{{ forloop.counter0 }}-bespoke_field" class="form-control"> 
       {% with forloop.counter as counter %} 
        {% for x,y in form.fields.bespoke_field.choices %} 
         {% if counter == forloop.counter0 %} 
          <option value="{{x}}" selected>{{y}}</option> 
         {% endif %} 
        {% endfor %} 
       {% endwith %} 
       </select> 
      </td> 
      <td>{{ form.value }}</td> 
     </tr> 
    {% endfor %} 
</table> 
+0

정확히 작동하지 않는 그 무엇인가 – Jonathan

+0

BespokeField.name을 Listing의 양식에 레이블로 표시하려면 List.ListingBespokeField 필드가 있어야합니다. 현재 'Bespoke field'가 표시됩니다. – HenryM

+1

공개 저장소에 대한 액세스 권한을 제공 할 수 있습니까? –

답변

2

내 솔루션입니까?