【问题标题】:Django Admin - saving data from custom formDjango Admin - 从自定义表单中保存数据
【发布时间】:2012-03-03 12:40:22
【问题描述】:

我需要自定义添加到模型页面的管理面板,相关输入来自另一个模型​​。但我不知道如何保存它们。

admin.py

class OrderAdmin(admin.ModelAdmin):
    change_form_template = 'admin/testapp/order/change_form.html'

    def change_view(self, request, object_id, extra_context=None):
        order = Order.objects.get(id=object_id)
        card_list = Card.objects.all().filter(type=order.type)
        result = super(OrderAdmin, self).change_view(request, object_id, extra_context={
        'card_list': card_list,
        })
        return result

change_form.html

    {% for card in card_list %}
    <input type="text" name="card-{{ card.id}}" value="{{ card.qty }}"></td>
    {% endfor %}

如何保存Card模型中改变的值?

我尝试按照此处所述进行操作: https://docs.djangoproject.com/en/1.3/ref/contrib/admin/#adding-custom-validation-to-the-admin

但是 self.cleaned_data 不包括我的输入数据。

谢谢。

UPD:嗯,我捕获了数据,但我认为这很混乱。 我几乎无法想象我将如何根据输入计算 id。

def save_model(self, request, obj, form, change):
        request.POST['card-288']

【问题讨论】:

  • 这就是你使用 django 表单的原因。如果你生成了一个表单集,你可以调用 formset(request.POST).save() 并完成它。

标签: django django-admin


【解决方案1】:

应在save_model 中进行保存。如果您使用了 django 表单,您的 card_list 数据 应该也 将在 form 参数中可用。尽管您仍然可以通过request 访问它,正如您正确指出的那样。

您还必须自己清理数据,这是 django forms 自动为您做的事情。

【讨论】:

  • 同样的结果。仅订购模型数据。 def save_model(self, request, obj, form, change): print form
【解决方案2】:

你得到的正是你制作的:),没有什么意外的!

如果您希望处理手动添加到 change_list 中的某些字段,则必须覆盖 clean(例如查看 here)。

如果你这样做,检索 ID 由你决定,但简单的 split('-')[-1] 就可以了。

这可以满足您的特定需求。

另一方面,我认为你的方法不对。 django 管理员足以处理 ForeignKeys ManyToMany,所以我认为没有必要自己做。

虽然您可以使用上述提示使其工作,但我建议您从头开始 - 如果您愿意,可以提出一个新的 SO 问题,您可以在其中发布初始模型以及您想要实现的具体目标。

【讨论】:

    猜你喜欢
    • 2015-11-20
    • 1970-01-01
    • 1970-01-01
    • 2011-12-14
    • 2018-02-22
    • 1970-01-01
    • 2019-08-29
    • 1970-01-01
    • 2011-06-15
    相关资源
    最近更新 更多