2017-10-17 1 views
0

현재 편집 양식을 상세보기와 동일한 페이지에서 Django으로 작업하려고합니다.동일한 페이지에 편집 양식과 상세보기가 있습니다

현재 문서에서 권장되는대로 (예 : FormMixin 사용) 시도하고 있습니다.

class ProductiveMinutesDetail(FormMixin, DetailView): 
    model = models.ProductiveMinutes 
    pk_url_kwarg = 'productiveminutes_pk' 
    form_class = forms.EditForm 

    def get_success_url(self): 
     return reverse_lazy('productiveminutes_list') 

    def get_context_data(self, **kwargs): 
     context = super(ProductiveMinutesDetail, self).get_context_data(**kwargs) 
     context['form'] = forms.EditForm(initial={'post': self.object}) 
     return context 

    def post(self, request, *args, **kwargs): 
     self.object = self.get_object() 
     form = self.get_form() 
     if form.is_valid(): 
      return self.form_valid(form) 
     else: 
      return self.form_invalid(form) 

    def form_valid(self, form): 
     form.save() 
     return super(ProductiveMinutesDetail, self).form_valid(form) 

그리고 내 양식은 다음과 같습니다 : 그래서, 내보기는 다음과 같습니다

class Scenario(models.Model): 
    name = models.CharField(max_length=200) 

class ProductiveMinutes(models.Model): 
    scenario = models.OneToOneField(Scenario) 
    name = models.CharField(max_length=200) 
    amount = models.DecimalField(max_digits=50, decimal_places=2) 
    description = models.CharField(max_length=200) 

이 내가 얻을 수 있습니다 사용 :

from django import forms 
from . import models 

class EditForm(forms.ModelForm): 
    class Meta: 
     model = models.ProductiveMinutes 
     fields = ('name', 'description',) 

내가 사용하고 모델이있다 양식을 페이지에 렌더링 할 수 있지만 이미 존재하는 데이터로 채워지기를 원할 때 필드가 비어있는 것처럼 잘못된 작업을하고 있음을 알고 있습니다.

복잡성의 또 다른 부분은이 양식이 namedescription 모델의 amount 필드를 편집하지 않아야한다는 것입니다. amount 값은이 페이지의 상세보기와 별도로 편집됩니다.

그래서 내 주요 질문은 이미 존재하는 모델 필드의 데이터로 채워지도록 양식을 가져온 다음 편집 할 수있는 것입니다. Django가 제공하는 일반 UpdateView과 같은 이상적인 기능입니다.

나는 이것에 어떤 도움이 많은 시간에 대한

감사 감사하겠습니다 1.10

장고 버전을 사용하고

UPDATE :

내 템플릿은 다음과 같습니다

:

{% extends 'pages/dashboard.html' %} 
{% load i18n humanize crispy_forms_tags %} 

{% block content %} 
    <div> 
     <h1 class="text-center">Productive Minutes: {{ productiveminutes.name }}</h1> 
     <div class="row"> 
      <div class="col"></div> 
      <div class="col-md-8 col-lg-8"> 
       <h3>Edit productive minutes: {{ productiveminutes.name }}</h3> 
       <form role="form" method="post"> 
        {% csrf_token %} 
        {{ form|crispy }} 
        <button class="primaryAction btn btn-primary pull-right" type="submit">{% trans "Submit" %}</button> 
       </form> 
      </div> 
      <div class="col"></div> 
     </div> 
     <hr> 
     <div class="row"> 
      <div class="col"></div> 
      <div class="col-md-8 col-lg-8"> 
       <h3>Data Records</h3> 
       <div class="table-responsive"> 
        <table class="table table-bordered"> 
         <thead class="thead-default"> 
          <tr> 
           <th>ID</th> 
           <th>Productive Minutes</th> 
           <th>Action</th> 
          </tr> 
         </thead> 
         <tbody> 
          <tr> 
           <td>{{ productiveminutes.id }}</td> 
           <td>{{ productiveminutes.amount|intcomma }}</td> 
           <td> 
            <a href="#"><i class="fa fa-pencil"></i></a> 
            <a href="#"><i class="fa fa-trash"></i></a> 
           </td> 
          </tr> 
         </tbody> 
        </table> 
       </div> 
      </div> 
      <div class="col"></div> 
     </div> 
    </div> 
{% endblock content %} 
+0

'post'를 무시해서는 안됩니다. 베이스 뷰와 믹스 인이이를 정의합니다. –

+0

Django 문서의 예제를 적용 할 때 다음과 같이 말합니다. 'ViewMixin을 사용하고 DetailView와 FormView를 혼합하여 사용하려고하지 않고 post()를 구현합니다. 이미 적절한 post()를 제공합니다. '), 그리고 일들이 훨씬 더 혼란스러워 질 것입니다. '그렇습니다. 아마 그렇게하는 것이 최선의 방법이 아니라는 것에 동의합니다. – BeeNag

답변

1

example in the docs은 디스플레이 용입니다. 개체에 대한 세부 정보 및 별도의 문의 양식이 있습니다.

ProductiveMinutesDetail 개체를 표시하고 같은 개체의 필드 중 일부를 업데이트 할 수있는 양식이있는 것 같습니다.. 이 경우 UpdateView을 사용해야합니다.

class ProductiveMinutesUpdate(UpdateView): 
    model = models.ProductiveMinutes 
    pk_url_kwarg = 'productiveminutes_pk' 
    form_class = forms.EditForm 

    success_url = reverse('productiveminutes_list') 

    def get_context_data(self, **kwargs): 
     context = super(ProductiveMinutesUpdate, self).get_context_data(**kwargs) 
     # Refresh the object from the database in case the form validation changed it 
     object = self.get_object() 
     context['object'] = context['productiveminutes'] = object 
     return context 
+0

같은 페이지에'UpdateView'와'DetailView'를 보여줄 수 있습니까? 현재 서식 파일에서 볼 수있는 것처럼이 업데이트 양식과 금액 필드 값을 같은 페이지에 표시 할 수 있어야합니다. – BeeNag

+0

걱정하지 않아도됩니다. 지금 작업하고 있습니다. 템플릿 이름도 전달해야만 필요한 세부 정보를 표시 할 수 있습니다. 올바른 방향으로 나를 가리켜 주셔서 고맙습니다. – BeeNag

+0

업데이트보기는 'DetailView'와 동일한'SingleObjectMixin'을 기반으로하므로 동일한 방법으로 템플릿의 객체에 액세스 할 수 있습니다.방금 기억 한 미묘한 점은 양식 유효성 검사가 개체를 변경한다는 것입니다. 양식이 유효하지 않을 때 혼동을 피하기 위해 데이터베이스에서 다시 가져 오는 것이 좋습니다. – Alasdair

관련 문제