ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2019-09-23 13:55:21  阅读:226  来源: 互联网

标签:python django django-forms


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))

标签:python,django,django-forms
来源: https://codeday.me/bug/20190923/1815243.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有