使用内联在前端启用Django管理功能

时间:2017-01-29 13:23:52

标签: python django django-admin formset inline-formset

我决定将管理网站的一些功能移到前端。功能包括管理一个带有一些外键内联的模型。

为此我已经安装了django-dynamic-formset JQuery插件(链接git)并且已经挣扎了几天。这是problems之一。

Django管理员已经实现了相同的功能。我可以根据需要添加,修改,删除内联和修改模型实例。 我想知道为什么我应该使用这个JQuery插件,以及为什么在互联网上没有这么多关于这个主题的好教程?

我需要一个很好的最新例子,说明如何在没有第三方JS文件的情况下在前端使用django formsets或inline formsets。如果它有链接(不是复选框)来删除内联项并添加将正确添加新内联的按钮,我会很高兴。

更具体,因为该问题被认为过于宽泛:

我有两个模特School和SchoolPlace:

class School(models.Model):
     name = models.CharField(_('School name'), max_length=100)

class SchoolPlace(models.Model):

    school = models.ForeignKey(School, verbose_name=_('school place'), related_name='school_places', blank=True, null=True)

    name = models.CharField(_('School place name'), max_length=200)

    city = models.ForeignKey(City, blank=True, null=True, verbose_name=_('city'),
                     help_text='city')

还有相应的表格:

class SchoolForm(forms.ModelForm):

      name = forms.CharField(
                             label=_('Name'),
                             widget=forms.TextInput(attrs={
                                'placeholder': _('school name')}),
                              max_length=100, required=True)

class SchoolPlaceForm(forms.ModelForm):

    name = forms.CharField(label=_('Name'),
                            widget=forms.TextInput(
                                        attrs={'placeholder': _('school place name')}),
                                        max_length=200,
                                        required=False)

    city = forms.ModelChoiceField(label=_('City'),
                                  widget=forms.Select(attrs={'class': 'ui search dropdown'}),
                                  queryset=City.objects.all(), required=False)

    class Meta:
        model = SchoolPlace
        fields = ['name','city']
        exclude = ['school']

我想以与Django管理员相同的方式编辑这两个模型,但仅限于我自己的前端。至于所有js文件已经在django.contrib.admin中,我想在不使用辅助应用程序和插件的情况下进行。

我需要与Django管理员相同的功能:添加,删除,修改SchoolPlace内联。以下是屏幕截图:enter image description here

2 个答案:

答案 0 :(得分:1)

我建议您使用管理表单(在您的视图中)或管理员视图(在自定义网址上),只需更改管理模板,甚至只需加载管理javascript,您就可以在管理模板中找到它。 / p>

答案 1 :(得分:1)

此任务需要前端和后端两侧的支持。

似乎最简单的方法是在前端使用django-admin表单,如果这对你来说是可以接受的。

任何django管理表单都会识别URL中的?_popup=1参数,以禁止管理页面装饰并仅提供表单。将包含所有必需的JavaScript和CSS样式。因此,管理表单可以显示在iframe的前端。在JavaScript级别上进行小规模的黑客攻击仍需要将iframe的大小调整为表单并通知页面然后关闭表单。