Django:添加“添加新”按钮为ModelForm中的ForeignKey [英] Django: adding an "Add new" button for a ForeignKey in a ModelForm

查看:98
本文介绍了Django:添加“添加新”按钮为ModelForm中的ForeignKey的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

TL;DR: How can I add an "Add new" button for a ForeignKey in a ModelForm?

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

Long version: I'm using Django 1.7 for a project. I have these two Models in my models.py

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

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

省略其他一些非相关字段

我正在使用ModelForm来添加新的订单,如下所示:

I am using a ModelForm to populate the db with new orders, like this:

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

Django做了很多在客户端字段添加下拉菜单方面做得很好,使用从客户端获取的条目进行填充。不过,我希望在添加相关订单的同时,添加一个添加新客户端链接/按钮/添加一个全新的客户端。

Django does quite a good job at adding a dropdown menu for the client field, populating it with entries taken from Client. Nevertheless, I'd like to have an "Add new client" link/button/whatever to add a brand new client at the same time I add a related Order.

Django管理员自动执行,添加一个+按钮来打开一个弹出窗口,但是我找不到一个简单的方法来做到这一点,像上面的模型窗体,我读了很多问题,在其他地方链接,但没有什么帮助我,任何想法?

Django admin does that automatically, adding a "+" button" that opens a popup, but I couldn't find an easy way to do that in a ModelForm like the one above. I read many questions here and links elsewhere, but nothing really helped me. Any idea about that?

推荐答案

我已经解决了一个自定义的小部件,我不记得我是否采取零件从Django管理员,或者我从头开始构建。

I have solved it in a custom widget. I don't remember if I took parts from Django admin, or I have built from scratch.

所以表单将是:

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参数的自定义视图是:

And the widget, that renders the "+" button and link to the add popup in the admin interface or to a custom view you provice with the related_url argument is:

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

这篇关于Django:添加“添加新”按钮为ModelForm中的ForeignKey的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆