我目前正在嘗試獲取與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)
使用這個我可以得到窗體在頁面上呈現,但我知道我做錯了,因爲這些字段是空的,我希望它們填充已存在的數據。
另一個複雜性是,此表單不應該編輯模型的amount
字段,只需編輯name
和description
即可。 amount
值與此頁面的詳細視圖分開編輯。
所以,我想我的主要問題是我怎樣才能得到的表單填充模型字段的數據已經存在,然後編輯它。理想的功能類似於Django提供的通用UpdateView
。
我使用Django版本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 %}
你不應該重寫'post';基本視圖和mixin爲你定義。 –
當我調整Django文檔中的示例時,他們說:「我們使用FormMixin並自己實現post(),而不是嘗試將DetailView與FormView混合(它提供了合適的post()),因爲這兩個視圖都實現了get (),事情會變得更加混亂。「所以,是的,我同意它可能不是最好的方式來做它 – BeeNag