2014-10-24 2 views
0

UpdateView를 사용하여 이미지 세부 정보를 업데이트하는 동안 문제가 발생합니다. 이미지 세부 정보가 성공적으로 저장되었지만 세부 정보를 업데이트/편집하는 동안 양식 필드가 비어있는 것으로 표시됩니다. 예상되는 시나리오는 편집 옵션이 트리거 될 때 양식 필드가 기존 값으로 미리 채워지도록하는 것입니다.UpdateView 양식 미리 채우기 오류

내 코드 :

models.py 

from photologue.models import Photo 
class PhotoContent(Photo) : 
    user = models.ForeignKey(User) 


forms.py 

class SiteAccessForm(forms.Form) : 

    access_key = forms.CharField(required = True, label = "Website Access Key", 
     max_length = 10) 


class PhotoForm(forms.ModelForm): 

    class Meta: 
     model = PhotoContent 
     fields = ('image', 'title', 'caption', 'crop_from',) 


views.py 


class GalleryListView(CookieMixin, FormMixin, PhotoListView) : 

    model = PhotoContent 
    form_class = SiteAccessForm 
    paginate_by = 20 

    def get_success_url(self): 
     username = self.kwargs['username'] 
     return reverse("photo_list", kwargs={"username" : str(username)}) 

    def get_template_names(self): 
     username = self.kwargs['username'] 
     if Theme.objects.filter(user__username=username).exists() : 
      theme_selected = Theme.objects.filter(user__username=username) 
      template_name = 'themes/%s/photologue/photo_list.html' % (theme_selected.values()[0]['name']) 
     else : 
      template_name = 'themes/default/photologue/photo_list.html' 
     return [template_name] 

    def get_queryset(self) : 
     username = self.kwargs['username'] 
     queryset = PhotoContent.objects.filter(user__username=username) 
     return queryset 

    def get_context_data(self, **kwargs): 
     context = super(GalleryListView, self).get_context_data(**kwargs) 
     logged_user = self.request.user 
     username = self.kwargs['username'] 

     context['object_list_len'] = len(PhotoContent.objects.filter(user__username=username)) 
     context['page_list']  = Page.objects.filter(user__username=username) 
     context['access_key'] = UserProfile.objects.filter(user__username=username).values()[0]['access_key'] 
     context['site_url'] = Site.objects.get_current() 

     form_class = self.get_form_class() 
     form  = self.get_form(form_class) 
     context['form'] = form 

     if 'access_granted' in self.request.COOKIES : 
      context['access_granted'] = self.request.COOKIES['access_granted'] 
     else : 
      context['access_granted'] = 'False' 

     context['username']  = username 

     return context 

    def post(self, request, *args, **kwargs): 

     self.object_list = self.get_queryset() 
     form_class = self.get_form_class() 
     form = self.get_form(form_class) 
     self.request.COOKIES.get('access_granted', 'False') 

     if form.is_valid(): 
      user_access_key = form.cleaned_data['access_key'] 
      username = self.kwargs['username'] 
      access_key = UserProfile.objects.filter(user__username=username).values()[0]['access_key'] 

      if user_access_key != access_key : 
       return self.form_invalid(form) 

      return self.form_valid(form) 
     else: 
      return self.form_invalid(form) 

    def form_valid(self, form): 
     self.add_cookie('access_granted', 'True', max_age=3600) 
     return super(GalleryListView, self).form_valid(form) 

    def form_invalid(self, form): 
     error = "Incorrect Access Key provided. Try again !!" 
     return self.render_to_response(self.get_context_data(form=form, error=error)) 

    def render_to_response(self, context, **response_kwargs): 
     response = super(GalleryListView, self).render_to_response(context, **response_kwargs) 
     if 'access_granted' not in self.request.COOKIES : 
      response.set_cookie("access_granted", "False") 
     return response 



class PhotoUpdateView(UpdateView) : 

    model = PhotoContent 
    form_class = PhotoForm 

    def get_template_names(self): 
     if Theme.objects.filter(user=self.request.user).exists() : 
      theme_selected = Theme.objects.filter(user=self.request.user) 
      template_name = 'themes/%s/photologue/photo_form.html' % (theme_selected.values()[0]['name']) 
     else : 
      template_name = 'themes/default/photologue/photo_form.html' 
     return [template_name] 

    def get_queryset(self) : 
     queryset = PhotoContent.objects.filter(user=self.request.user) 
     return queryset 

    def get_context_data(self, **kwargs): 
     context = super(PhotoUpdateView, self).get_context_data(**kwargs) 
     context['username'] = self.kwargs['username'] 
     context['logged_user'] = self.request.user 
     return context 

    def get_success_url(self): 
     return reverse('photo_list', kwargs={"username" : str(self.request.user)}) 



photo_list.html 

{% extends "themes/default/index.html" %} 
{% load url from future %} 

{% block content %} 
    <h1 class="page-header">Photo Album</h1> 
    {% if object_list %} 
     {% for photo in object_list %} 
      <div class="col-lg-3 col-md-4 col-sm-6 col-xs-12 thumb body_color"> 
       <a class='href_color' href="{% url 'photo_detail' username=username pk=photo.pk %}"> 
        <img src="{{ photo.get_thumbnail_url }}" alt="{{ photo.title }}"/><br> 
        {{photo.title}} 
        {% if logged_user == username %} 
         <form method="post" action="{% url 'photo_update' username=username pk=photo.pk %}"> 
          {% csrf_token %} 

          <!-- When this button is clicked, it opens an empty form --> 

          <input type="submit" value="Edit Photo" class="btn btn-primary"> 
         </form> 
         <form method="post" action="{% url 'photo_delete' username=username pk=photo.pk %}"> 
          {% csrf_token %} 
          <input type="submit" value="Delete Photo" class="btn btn-primary"> 
         </form> 
        {% endif %} 
       </a> 
      </div> 
     {% endfor %} 
    {% else %} 
     <h3>No Photos are available.</h3> 
    {% endif %} 
{% endblock %} 



photo_form.html 


{% extends "themes/default/index.html" %} 
{% load staticfiles %} 

{% block content %} 
    <a href="{% url 'photo_list' username=logged_user.username %}"><button type="submit" class="btn btn-primary">Back</button></a><br> 
    <form method="post" action="" enctype="multipart/form-data"> 
     {% csrf_token %} 
     <br> 
     {% for field in form %} 
      <div class='form_content_color'> 
       {{ field.label_tag }}<br> 
       {{ field }}<br><br> 
      </div> 
     {% endfor %} 
     <button type="submit" class="btn btn-primary">Submit</button> 
    </form> 
{% endblock content %} 
<body> 
</body> 
</html> 


urls.py 

url(r'^(?P<username>[-\w\d]+)/photo-album$', GalleryListView.as_view(), name='photo_list'), 
url(r'^photo/edit/(?P<username>[-\w\d]+)/(?P<pk>[\d]+)$', auth(PhotoUpdateView.as_view()), name='photo_update'), 

어떤 도움/제안은 매우 이해할 수있을 것이다.

감사합니다.

+0

로 변경하거나'을 print'? – madzohan

+0

나는 아래에서 이미 시도했다 : http://pastebin.com/XDMHivNK 그리고 템플릿에서만 Photoform을 얻고 있지만 빈 필드와 오류라는 제목 필드가 필요합니다. – user2722127

답변

1

해결했습니다!

링크 편집에서 'POST'방법을 잘못 사용하고있었습니다.

<form method='post' action="{% url 'photo_update' username=username pk=photo.pk %}"> 
    {% csrf_token %} 
    <input type="submit" value="Edit Photo" class="btn btn-primary"> 
</form> 

는 PhotoUpdateView``디버그`get_context_data` 두 번째 줄`컨텍스트 [ '형태'] '를 검사하는 시도 해 봤나

<form action="{% url 'photo_update' username=username pk=photo.pk %}"> 
    {% csrf_token %} 
    <input type="submit" value="Edit Photo" class="btn btn-primary"> 
</form>