在同一页上有编辑表单和详细视图
问题描述:
我目前正在尝试获取与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 %}
答
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
你不应该重写'post';基本视图和mixin为你定义。 –
当我调整Django文档中的示例时,他们说:“我们使用FormMixin并自己实现post(),而不是尝试将DetailView与FormView混合(它提供了合适的post()),因为这两个视图都实现了get (),事情会变得更加混乱。“所以,是的,我同意它可能不是最好的方式来做它 – BeeNag