当前位置: 首页 > 面试题库 >

Django admin-内联内联(或一次编辑三个模型)

陆宝
2023-03-14
问题内容

我有一组看起来像这样的模型:

class Page(models.Model):
    title = models.CharField(max_length=255)

class LinkSection(models.Model):
    page = models.ForeignKey(Page)
    title = models.CharField(max_length=255)

class Link(models.Model):
    linksection = models.ForeignKey(LinkSection)
    text = models.CharField(max_length=255)
    url = models.URLField()

和一个看起来像这样的admin.py

class LinkInline(admin.TabularInline):
    model = Link
class LinkSectionInline(admin.TabularInline):
    model = LinkSection
    inlines = [ LinkInline, ]
class PageAdmin(admin.ModelAdmin):
    inlines = [ LinkSectionInline, ]

我的目标是获得一个管理界面,使我可以在一页上编辑所有内容。这种模型结构的最终结果是,事物被生成到一个视图+模板中,看起来或多或少像:

<h1>{{page.title}}</h1>
{% for ls in page.linksection_set.objects.all %}
<div>
    <h2>{{ls.title}}</h2>
    <ul>
         {% for l in ls.link_set.objects.all %}
        <li><a href="{{l.url}}">{{l.title}}</a></li>
         {% endfor %}
    </ul>
</div>
{% endfor %}

我知道,如我所料,内联的内联技巧在Django管理员中失败。有人知道允许这种三级模型编辑的方法吗?提前致谢。


问题答案:

你需要创建一个自定义表单和模板的LinkSectionInline

像这样的东西应该适用于以下形式:

LinkFormset = forms.modelformset_factory(Link)
class LinkSectionForm(forms.ModelForm):
    def __init__(self, **kwargs):
        super(LinkSectionForm, self).__init__(**kwargs)
        self.link_formset = LinkFormset(instance=self.instance, 
                                        data=self.data or None,
                                        prefix=self.prefix)

    def is_valid(self):
        return (super(LinkSectionForm, self).is_valid() and 
                    self.link_formset.is_valid())

    def save(self, commit=True):
        # Supporting commit=False is another can of worms.  No use dealing
        # it before it's needed. (YAGNI)
        assert commit == True 
        res = super(LinkSectionForm, self).save(commit=commit)
        self.link_formset.save()
        return res

(那只是从我头顶上冒出来的,未经测试,但这应该可以使你朝正确的方向前进。)

你的模板只需要适当地呈现form和form.link_formset。



 类似资料:
  • 问题内容: 我正在与AngularJS一起显示应用程序键(应用程序标识符)表,我想使用编辑按钮在该表行中显示一个小表格。然后用户可以编辑字段并单击“保存”或“取消” 演示:http://jsfiddle.net/Thw8n/ 我的内联表单效果很好。我单击编辑,然后出现一个表格。取消也很棒。 我的问题是 如何连接保存按钮和将对API进行$ http调用的函数 如何从该行获取数据以发送到$ http调

  • 问题内容: 我正在Oracle APEX中工作。我想通过三个表进行报告。这些表称为Fallows。 患者(Par_Id(Pk),Pat_Name,Pat_Gender) 历史记录(His_Id(Pk),Pat_id(Fk),Treated_By) 和 处理(Treat_Id,His_id(Fk),Pat_id(Fk),Treat_Type,收费) 我想显示以上三个表中提到的“报告”中的所有列。 谢

  • 看看这个例子https://editor.datatables.net/examples/inline-editing/simple 它允许您在单击单元格时编辑文本。如果单击单元格,它将呈现为标记 我的情况,我想要有点不同。每行都有一个编辑按钮,用户点击编辑按钮,然后所有输入标签将显示在该行上。 我在上找不到任何演示或如何执行此操作,您能给我一些建议吗?

  • 我想在我的剑道ui网格中进行内联编辑。数据绑定似乎工作正常,但当我在编辑某些内容后单击“更新”按钮时,范围会得到更新,但编辑对话框不会消失。如果单击另一个编辑按钮,它将进入失效状态。毕竟,只有当我至少提供一个伪函数作为k-save时,它才会更新作用域。出于某种原因,单击“取消”按钮确实会更新范围。所以“取消”按钮实现了我对“更新”按钮的期望。 您可能会看到,我想更新客户端的本地范围,而不是向任何服

  • 为了极端底层操作和性能要求,你可能希望直接控制 CPU。Rust 通过asm!宏来支持使用内联汇编。 asm!(assembly template : output operands : input operands : clobbers : options ); 任何asm的使用需要功能通道(需要在包装箱上加上#![feature(asm)]来允许使用)并且当然也

  • 问题内容: VS 哪种被认为是 正确的 (语法上)且性能最高的方法,为什么? 后一个示例中的语法对我来说似乎更合乎逻辑,但我的假设是JOIN会更快。 我看过查询计划,还无法从中解密任何内容。 查询计划1 查询计划2 问题答案: 两种语法有不同的用途。假设使用Join语法,则需要StockToCategory和Category表中的某些内容。如果每个类别的StockToCategory表中有多个条目