在同一页面上有一个编辑表单和一个详细信息视图

时间:2017-10-17 13:46:48

标签: django django-forms django-views

我目前正在尝试使用与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)

使用这个我可以在页面上显示表单,但我知道我做错了,因为当我希望用已经存在的数据填充它们时字段是空的。

另一个复杂因素是,此表单不应仅仅amountname来修改模型的description字段。 amount值与此页面的详细信息视图分开编辑。

所以,我想我的主要问题是如何让表格填充已经存在的模型字段的数据然后进行编辑。理想的功能类似于Django提供的通用UpdateView的功能。

我正在使用Django版本1.10

非常感谢任何帮助

感谢您的时间

更新:

我的模板如下所示:

{% 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 %}

1 个答案:

答案 0 :(得分: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