- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 Expense
模型和 ExpenseLineItem
模型。就像典型的费用/发票一样,一项费用可以有多个行项目来构成发票的总成本。我正在尝试使用基于类的 View 来创建和更新费用。我已经成功地编码了 CreateView
使用多个费用行项目制作新费用。
我的问题是当我尝试更新已经有几个费用行项目的现有费用时。下面是我的代码,我无法弄清楚问题是什么。 mixin ( TitleMixin
, CancelSuccessMixin
, SelectedApartment
) 是我的并且工作正常。
我收到一个错误,我相信这意味着它正在尝试保存 ExpenseLineItems
的新副本。但由于那些已经存在而失败。几乎就像我没有提供 instance
争论。
我究竟做错了什么?
forms.py
class ExpenseForm(ModelForm):
class Meta:
model = Expense
fields = ['apart', 'inv_num', 'vendor', 'due_date']
ExpenseLineItemFormset = inlineformset_factory(Expense, ExpenseLineItem, fields=('description', 'account', 'amt'), can_delete=False)
ExpenseUpdate
看法:
class ExpenseUpdate(TitleMixin, CancelSuccessMixin, SelectedApartment, UpdateView):
model = Expense
form_class = ExpenseForm
template_name = 'accounting/expense.html'
def get(self, request, *args, **kwargs):
self.object = self.get_object()
form_class = self.get_form_class()
form = self.get_form(form_class)
expense_line_item_form = ExpenseLineItemFormset(instance = self.object)
return self.render_to_response(self.get_context_data(form = form, expense_line_item_form = expense_line_item_form))
def post(self, request, *args, **kwargs):
self.object = self.get_object()
form_class = self.get_form_class()
form = self.get_form(form_class)
expense_line_item_form = ExpenseLineItemFormset(self.request.POST, instance=self.object)
if (form.is_valid() and expense_line_item_form.is_valid()):
return self.form_valid(form, expense_line_item_form)
return self.form_invalid(form, expense_line_item_form)
def form_valid(self, form, expense_line_item_form):
self.object = form.save()
expense_line_item_form.instance = self.object
expense_line_item_form.save()
return HttpResponseRedirect(self.get_success_url())
def form_invalid(self, form, expense_line_item_form):
return self.render_to_response(self.get_context_data(form=form, expense_line_item_form=expense_line_item_form))
MultiValueDictKeyError at /stuff/2/accounting/update-expense/25/
"u'expenselineitem_set-0-id'"
Request Method: POST
Request URL: http://localhost:8000/stuff/2/accounting/update-expense/25/
Django Version: 1.8.3
Exception Type: MultiValueDictKeyError
Exception Value:
"u'expenselineitem_set-0-id'"
Exception Location: /usr/local/lib/python2.7/dist-packages/django/utils/datastructures.py in __getitem__, line 322
<form class="form-horizontal" action="" method="post">
{% csrf_token %}
{% load widget_tweaks %}
<div class="row">
<div class="col-md-12">
<table class="table table-tight">
<thead>
<th>Description</th>
<th class="text-right">Account</th>
<th class="text-right">Amount</th>
</thead>
<tbody>
{{ expense_line_item_form.management_form }}
{% for eli in expense_line_item_form %}
<tr>
<td>{{ eli.description|attr:'cols:29' }}</td>
<td class="text-right">{{ eli.account }}</td>
<td class="text-right">{{ eli.amt }}</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
<div class="col-md-12 text-right">
<a href="{{ cancel }}" class="btn btn-default btn-lg">Cancel</a>
<input class="btn btn-success btn-lg" type="submit" value="Post" />
</div>
<br><br>
</form>
<tbody>
{{ expense_line_item_form.management_form }}
{% for eli in expense_line_item_form %}
<tr>
<td>{{ eli.id }} {{ eli.description|attr:'cols:29' }}</td> <!-- <<==== Here's where I simply added {{ eli.id }}. That's all I changed :) -->
<td class="text-right">{{ eli.account }}</td>
<td class="text-right">{{ eli.amt }}</td>
</tr>
{% endfor %}
</tbody>
最佳答案
您需要在表单集中包含每个表单的表单 ID(它不会显示给用户,因为它被呈现为隐藏输入)。如果没有该表单,POST 数据中将缺少该值,并且您会得到 KeyError
正如你所看到的。
来自 formset docs :
Notice how we need to explicitly render
{{ form.id }}
. This ensures that the model formset, in the POST case, will work correctly. (This example assumes a primary key named id. If you’ve explicitly defined your own primary key that isn’t called id, make sure it gets rendered.)
{% for eli in expense_line_item_form %}
遍历表单集,所以你需要包含
{{ eli.id }}
.
关于Django - 带有内联表单集的 UpdateView 试图保存重复记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32575535/
我有一个表单类,看起来像.. #forms.py class ExampleForm(forms.Form): color = forms.CharField(max_length=25)
是否可以从与pk相关的网址中删除UpdateView? 例如,如果我有 url(r'^myobj/update/(?P\d+)/$', views.UpdateMyObj.as_view(), nam
我创建了一个继承UpdateView的类 View 。我已经指定了应该构建表单的字段和模型。现在假设我有一封现场电子邮件,那么我想在表单中禁用它。我不知道如何做到这一点。 class UserUpda
是否可以将多个模型传入 UpdateView ? 就像是: models = (FirstModel, SecondModel) 最佳答案 不是通过 models UpdateView 的属性. 但是
我有以 slugfield 作为主键的模型。 当我点击更新按钮时,我有更新 View ,它会创建新对象。 例如: 旧记录:标题=数据1 更新条目:标题=数据2 输出: 数据2 数据1 模型.py cl
所以我将 UpdateView 设置为向表单发送一个 request 对象,这样我就可以修改表单中的查询集(基于 request.user) 我的观点.py: class DataSourceUpda
我有一个 Users和 Jobs .如果一些User创建一个 Job , 然后他/她才能编辑这个 Job 的一些信息. 于是他访问了url .../job/update/ .如果Job是由他创建的(U
我有以下单元测试 def test_category_update_view(self): """ Make sure that a category can be updated
我有这样的架构: 模型.py: class Evento(models.Model): [...] user = ForeignKey(model=User) 表单.py: class
我正在使用 UpdateView 更新一系列字段。但是,我只希望将已修改的字段保存到数据库中。如果在更新过程中未为某个字段提供值,我希望将以前的值用作默认值。如果为字段提供了新值,则只应更新该字段。我
Django 和编程菜鸟在这里。我已经制作了一个我想要部署的应用程序,但我需要弄清楚如何将对该对象的创建者的 UpdateView 访问限制为,我很难过。 当前,用户可以使用 CreateView .
我想控制只有 super 用户,例如老师,可以访问继承自 UpdateView 的页面,并将其他人重定向到 /404 页面. 我在 views.py 中的类: class Edit_news(Upda
我有一个网站,用户可以在其中创建和编辑自己的列表。 我正在使用通用 View CreateView 来允许用户创建列表。 我想使用通用 View UpdateView 来允许他们编辑列表,但 logi
在Django中基于类的UpdateView中,我排除了用户字段,因为它是系统内部的,并且我不会要求它。现在,将用户传递到表单的Django正确方法是什么。 (我现在的操作方式是,将用户传递到表单的
我希望我的用户能够查看页面、更新该页面,然后返回到该页面或继续进行更多编辑。 这是显示信息的 View : # urls.py url(r'^gameview/$', views.G
我有一个具有 ManyToMany 关系的模型,我想用 CheckBoxSelectMultiple 小部件更新它,而其他所有小部件都使用默认的通用表单,但是当我重新定义一个表单字段时,它是唯一一个显
我有一个 Expense模型和 ExpenseLineItem模型。就像典型的费用/发票一样,一项费用可以有多个行项目来构成发票的总成本。我正在尝试使用基于类的 View 来创建和更新费用。我已经成功
我尝试了通用 View 的简约 django 实现来上传个人资料图片。 View .py class UpdateProfile(UpdateView): form_class = Updat
编辑: 对我来说更好的解决方案是使用权限系统,特别是因为我需要对对象进行其他类型的受控访问。我现在使用 Django-guardian 来帮助处理这样的对象级权限。 原文: 我正在通过让用户上传故事以
有没有办法在更新 View 中更新唯一字段?我有一个具有 name 和 age 字段的模型,但是当我尝试更新 age 时甚至不更改 的值name,它返回一个错误,该名称已存在于数据库中 模型.py c
我是一名优秀的程序员,十分优秀!