2013-03-04 3 views
1

사용자가 프로젝트를 만들 수있는 앱을 만들고 있습니다. 각 프로젝트 내에서 사진을 연결할 수있는 '위치'를 만들 수 있습니다. 사진은 많은 다른 유형의 모델과 연관 될 수있는 일반적인 내용 모델입니다. 이 경우 사진이 이미 업로드되어 프로젝트에 연결되어 있습니다. 사용자는 javascript 모달 창을 통해 위치와 연결되도록 선택하고 '메모'를 추가 할 수 있습니다.Django는 모델 형태로 이미지를 표시합니다. 유효성 검사 오류시 formset

원래 전적으로 수동으로 제작했으며 request.POST를 통해보기에서 사진에 액세스했습니다. 그러나 필자는 노트의 텍스트 값에 약간의 문제가 있었기 때문에 적절하게 처리하고 실제 모델 formset을 만드는 것이 더 쉽거나 더 좋을 것이라고 결정했습니다. 나는 사진과 메모를 추가하고, 또한 이전에있는 경우 위치에서 제거 할 수 있습니다 -

사진 는 형태

이 잘 작동의 .instance 속성에 액세스하여 템플릿에 표시됩니다 추가되었습니다. 그러나 양식에 유효성 검사 오류가 있고 사용자가이를 처리하기 위해 서식 파일로 돌아 가면 이미지 자체가 표시되지 않습니다. 이것은 양식에 인스턴스 속성이 첨부되어 있지 않기 때문인 것으로 보입니다. 사진은 위치에 이미 저장되어 있지만 방금 추가/수정 된 사진에는 표시되지 않는 <img src="{{MEDIA_URL}}{{ photo.instance.photo.small.url }}"> 태그 (간편한 축소판 사용)를 통해 문제없이 표시됩니다.

내 질문은 -이 상황에서 멋진 예쁜 그림을 어떻게 표시 할 수 있습니까?

여기 내 모델 형태입니다 :

class PhotoDisplayForm(ModelForm): 

class Meta: 
    model = Photo 
    fields = {'id', 'note', } 
    widgets = { 
     'note': Textarea(attrs={'rows': 3}), 
     'photo': HiddenInput(), 
     'id': HiddenInput(), 
    } 

views.py

def location_form(request, project_id, location_id=None): 
project = Project.objects.get(id=project_id) 
photos_formset = [] 

if location_id is None: #creates unbound forms 
    locPhotoFS = formset_factory(PhotoDisplayForm, max_num=0, can_delete=True) 
    photos_formset = locPhotoFS(prefix='loc_photos') 

    use_type = 'create' #this variable is passed to the template to display appropriate text 
    location_form = QuadratForm(request.POST or None, project_id=project_id) 

else: ### edit an existing form #### 
    use_type = 'edit' 
    location = get_object_or_404(Location, pk=location_id) 
    location_form = QuadratForm(request.POST or None, project_id=project_id) 

    location_photos = Photo.objects.filter(location = location) 
    locPhotoFS = modelformset_factory(Photo, PhotoDisplayForm, max_num=0, can_delete=True) 
    photos_formset = locPhotoFS(queryset = location_photos, prefix='loc_photos')    

if request.method == 'POST': 
    photos_formset = locPhotoFS(request.POST, prefix='loc_photos') 

    if location_form.is_valid() and photos_formset.is_valid(): 
     location_instance = location_form.save(commit=False) 
     location_instance.project = get_object_or_404(Project, pk=project_id) 
     location_instance.save() 

     for form in photos_formset: 
      p = form.cleaned_data['id'] 
      if form.cleaned_data['DELETE']: 
       p.content_object = project #reassociate the photo with the project 
       p.save() 
      else: 
       p.content_object = location_instance 
       p.note = form.cleaned_data['note'].strip() 
       print p.note 
       p.save() 

     return HttpResponseRedirect(reverse('core.views.location', args=(project_id, location_instance.id))) 
    else: 
     print 'there are errors' 
context = {'location_type': location_type, 'use_type': use_type,'location_form': location_form,'project_photos': project.photos.all()} 
if photos_formset: 
    context['photos_formset'] = photos_formset 
return render(request, 'location_form.html', context) 

템플릿

{% if photos_formset %} 
    {% if location_form.non_field_errors %}{{ location_form.non_field_errors }}{% endif %} 
    {{ photos_formset.management_form }} 
    {% for photo in photos_formset %} 
    {% if photo.non_field_errors %}{{ photo.non_field_errors }}{% endif %} 
    <div class="photo-details original" id="{{photo.instance.id}}_photo-details"> 
     <button type="button" photo="{{photo.instance.id}}" class="close pull-right photo-delete" aria-hidden="true">&times;</button> 
     <div class="photo-notes">{{ photo.note.label_tag }}{{ photo.note|attr:"class:photo_notes_input" }}{{ photo.errors }}</div> 
    {{ photo.id }} 
    {{ photo.DELETE|attr:"class:delete-photo" }} 
    <div class="thumbnail-caption"> 
    <img src="{{MEDIA_URL}}{{ photo.instance.photo.small.url }}"> 
    <br>{{ photo.instance.title }} 
    </div> 
    </div> 
    {% endfor %} 
    {% endif %} 

그 유용 경우 여기에 사진 모델 자체의 :

class Photo(models.Model): 

    title = models.CharField(max_length=30) 
    photo = ThumbnailerImageField(upload_to=imagePath) 
    object_id = models.PositiveIntegerField() 
    content_type = models.ForeignKey(ContentType) 
    content_object = generic.GenericForeignKey('content_type', 'object_id') 
    note = models.TextField(max_length=200, blank=True) 

    def __unicode__(self): 
     return self.title 

답변

0

나는 (다소 해키 한) 해결책을 찾아 냈습니다. 나는 이미 템플릿에 전달되는 project_photos라는 쿼리 세트를 가지고 있기 때문에 (사진이 위치에 추가하도록 선택할 수있는 javascript 모달리스트를 생성합니다), 템플릿의 루프를 반복하고 id가 일치하는 위치를 찾습니다. (변수 사진이 해당 formset 루프 내에서 현재의 형태이다) :이있는 StringFormat 템플릿 필터를 사용할 필요가 있었다

<div class="thumbnail-caption"> 
     {% if photo.instance.title %} 
     <img src="{{MEDIA_URL}}{{ photo.instance.photo.small.url }}"> 
     <br>{{ photo.instance.title }} 
     {% else %} 
      {% with p=photo.id.value %} 
       {% for pp in project_photos %} 
        {% ifequal p|stringformat:"s" pp.id|stringformat:"s" %} 
         <img src="{{MEDIA_URL}}{{ pp.photo.small.url }}"> 
         <br>{{ pp.title }} 
        {% endifequal %} 
       {% endfor %} 
      {% endwith %} 
     {% endif %} 
    </div> 

- 잠시 동안 나를 붙어있어.

이 사진은 원본 자바 스크립트 창 (분명히 그 문제를 해결할 수 있음)에 여전히 표시되어 있기 때문에 완벽한 솔루션은 아닙니다. 또한 템플릿은 각각의 개체에 대해 잠재적으로 커다란 개체 목록을 반복해야합니다. 천천히.

감사의 뜻을 표합니다.

관련 문제