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

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

以上是 Django:在ModelForm中为ForeignKey添加“添加新”按钮 的全部内容, 来源链接: utcz.com/qa/426059.html

回到顶部