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

Django:在ModelForm中为ForeignKey添加“添加新”按钮

督冠玉
2023-03-14
问题内容

TL; DR:如何在ModelForm中为ForeignKey添加“添加新”按钮?

长版:我在项目中使用Django 1.7。我的models.py中有这两个模型

class Client(models.Model):
    name = models.CharField(max_length=100)

class Order(models.Model):
    code = models.IntegerField()
    client = models.ForeignKey(Client)

[省略了一些其他不相关的字段]

我正在使用ModelForm用新命令填充数据库,如下所示:

class OrderNewForm(forms.ModelForm):
    class Meta:
        model = Order

Django在为客户字段添加下拉菜单方面做得很好,并在其中添加了来自客户的条目。不过,我想拥有一个“添加新客户”链接/按钮/以便在添加相关订单的同时添加一个全新的客户。

Django管理员会自动执行此操作,并添加一个“ +”按钮”以打开弹出窗口,但我找不到像上述模型那样在ModelForm中执行此操作的简便方法。我在这里阅读了许多问题,并在其他地方看到了链接,但实际上并没有帮助了我,有什么想法吗?


问题答案:

我已经在一个自定义小部件中解决了它。我不记得我是从Django管理员那儿学来的,还是从头开始构建的。

因此,形式为:

class OrderNewForm(forms.ModelForm):

   client = forms.ModelChoiceField(
       required=False,
       queryset=Client.objects.all(),
       widget=RelatedFieldWidgetCanAdd(Client, related_url="so_client_add")
                                )
   class Meta:
       model = Order
       fields = ('code', 'client')

呈现“ +”按钮并链接到管理界面中的添加弹出窗口或链接至你使用related_url参数提供的自定义视图的小部件是:

from django.core.urlresolvers import reverse
from django.utils.safestring import mark_safe
from django.forms import widgets
from django.conf import settings

class RelatedFieldWidgetCanAdd(widgets.Select):

    def __init__(self, related_model, related_url=None, *args, **kw):

        super(RelatedFieldWidgetCanAdd, self).__init__(*args, **kw)

        if not related_url:
            rel_to = related_model
            info = (rel_to._meta.app_label, rel_to._meta.object_name.lower())
            related_url = 'admin:%s_%s_add' % info

        # Be careful that here "reverse" is not allowed
        self.related_url = related_url

    def render(self, name, value, *args, **kwargs):
        self.related_url = reverse(self.related_url)
        output = [super(RelatedFieldWidgetCanAdd, self).render(name, value, *args, **kwargs)]
        output.append(u'<a href="%s" class="add-another" id="add_id_%s" onclick="return showAddAnotherPopup(this);"> ' % \
            (self.related_url, name))
        output.append(u'<img src="%sadmin/img/icon_addlink.gif" width="10" height="10" alt="%s"/></a>' % (settings.STATIC_URL, _('Add Another')))                                                                                                                               
       return mark_safe(u''.join(output))


 类似资料:
  • 问题内容: 我想做的是显示一个单一的表格,让用户: 输入文档标题(来自模型) 从下拉列表中选择一个选项(由模型填充) 输入(存储在模型中) 我不确定如何在表单中显示外键关系的字段。我知道在视图中你可以使用document.code_set(例如)访问当前document对象的相关对象,但是我不确定如何将其应用于ModelForm。 我的模特: 我的模型表格 问题答案: 关于以表格形式显示外键字段,

  • 问题内容: 我正在尝试提供一组可以重复或删除的输入。 我发现并使用了以下方法的组合:https : //jsfiddle.net/69z2wepo/36745/ 并且(因为上面的代码无法处理删除操作):https : //codepen.io/lichin-lin/pen/ MKMezg 我可能不需要指向一个特定的输入,因为在我的界面中,您应该始终只添加一个新的(如果之前的一个已填充)(我将在稍后

  • 问题内容: 说我的内容如下: 即有多个,每个都有一个和的范围。每个数据库都应有一个从其父数据库中选择的基础,而不是另一个。 创建用于添加的表单时,我想删除选择(因为已经通过页面上的“添加客户端”按钮Rate选择了该选项),并且也将选择限制于此。 我该如何在Django 1.0中做到这一点? 目前,我当前的文件只是样板文件: 而且也是基本的: 在Django 0.96中,我能够通过在渲染模板之前进行

  • 我有一些问题在按钮中添加代码,所以示例:我在数量上输入2它将*价格和数量示例400*2=800,但当我再次输入2意味着800x2=1600,有人能指导我吗?谢谢,最后2行显示了错误。 `private void jButton2ActionPerformed(java.awt.event.ActionEvt){ int id=integer.parseint(jTextField1.getText

  • 问题内容: 说我的内容如下: 即有多个,每个都有一个和的范围。每个数据库Client都应有一个Rate从其父数据库中选择的基础,而不是另一个。 创建用于添加的表单时,我想删除选择(因为已经通过页面上的“添加客户端”按钮选择了该选项),并且也将选择限制于此。 我该如何在Django 1.0中做到这一点? 目前,我当前的forms.py文件只是样板文件: 而且views.py也是基本的: 在Djang

  • 问题内容: 我有一个运行良好的Django应用程序。我正在添加REST服务。我正在寻找有关REST策略的其他信息。 以下是一些我正在绞尽脑汁的事例。 现在,我正在使用带有大量补丁的Django-REST API。 我正在考虑退一步,而只是在Django中编写返回JSON结果的视图函数。 我还可以看到在Apache中过滤REST请求并将它们路由到一个单独的非Django服务器实例。 请为每个答案指定