現在、編集フォームを詳細ページと同じページで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)
そして、私のフォームは次のようになります。
from django import forms
from . import models
class EditForm(forms.ModelForm):
class Meta:
model = models.ProductiveMinutes
fields = ('name', 'description',)
私が使用しているモデルはこれです:
これを使用して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)
私が得ることができますフォームをレンダリングしてページに表示しますが、すでに存在するデータが表示されるようにするには、フィールドが空であるため、何か間違ったことをしています。
もう1つの複雑さは、このフォームがname
とdescription
のモデルのamount
フィールドを編集してはならないということです。 amount
の値は、このページの詳細ビューとは別に編集されます。
私の主な質問は、すでに存在するモデルフィールドのデータを取り込むフォームを取得してから編集する方法です。 Djangoが提供する汎用のUpdateView
のような機能が理想的です。
私はこれですべてのヘルプははるかにお時間を
おかげでいただければ幸い1.10
Djangoのバージョンを使用しています
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 %}
あなたは 'post'を上書きしないでください。ベースビューとミックスインはそれをあなたのために定義します。 –
私はDjangoのドキュメントからこの例を採用しています。「ViewMixinを使用して、両方のビューが実装するため、DetailViewとFormView(これは適切なpost()を提供しています)だから、私はそれがおそらく最良の方法ではないことに同意する – BeeNag