【问题标题】:Django 1.5 Creating multiple instances of model in ModelAdminDjango 1.5 在 ModelAdmin 中创建模型的多个实例
【发布时间】:2013-10-01 11:30:51
【问题描述】:

我对这个任务有点困惑:

我有 2 个表:用户、代码

我想以特定模式随机生成代码。 我已经把那部分写成一个函数,但是很难实现这个函数 在 ModelAdmin 中。

因此,如果有人知道实现此目的的技巧,我将非常高兴。 在用户表单中有一个按钮来调用函数就足够了,然后它会创建这些代码。

但是如何实现这样的按钮呢? 有没有办法解决这个问题?

编辑:错字

解决方案: 由于我想为特定用户生成凭证,我可以像这样编辑 admin.py

class MyUserAdmin(UserAdmin):
    def vouchers(self, obj):
            return "<a href='%s'>Generate vouchers</a>" % reverse(gen_voucher_view, kwargs={'user':obj.pk,})
    vouchers.allow_tags = True
    list_display = (..., 'vouchers')

代表我的用户模型管理视图中的可点击链接。

现在我通过添加将链接连接到 urls.py 中的视图

url(r'admin/gen_vouchers/(?P<user>\w+)/$', gen_voucher_view, name='gen_voucher_view')

到 urlpatterns。

为了创建优惠券,我在 forms.py

中提供了一个表格
class VoucherGeneratorForm(forms.Form):    
    user = forms.CharField(User, required=True, widget=forms.HiddenInput())
    amount = forms.IntegerField(min_value=0, max_value=500, required=True)
    readonly = ('user', )

views.py 我正在添加我的视图函数:

@login_required
def gen_voucher_view(request, user):
  if request.method == 'POST': # If the form has been submitted...
    form = VoucherGeneratorForm(request.POST) # A form bound to the POST data
    if form.is_valid(): # All validation rules pass
        # GENERATE vouchers here by using form.cleaned_data['amount']
        # and user (generate_vouchers is a self defined function)
        vouchers = generate_vouchers(user, form.cleaned_data['amount']
        # set error or info message
        if len(vouchers) == form.cleaned_data['amount']:
            messages.info(request, "Successfully generated %d voucher codes for %s" % (form.cleaned_data['amount'], user))
        else:
            messages.error(request, "Something went wrong")
        u = User.objects.get(pk=user)
        form = VoucherGeneratorForm(initial={'user':user}) # An unbound form
        return render_to_response('admin/codes.html', {'request': request, 'user':user, 'form':form, 'userobj': u}, context_instance=RequestContext(request))
    else:
        form = VoucherGeneratorForm(initial={'user':user}) # An unbound form

最后但并非最不重要的一点是创建一个模板 admin/codes.html 在其中显示我的表单:

{% extends "admin/base_site.html" %}
{% load i18n admin_static static %}

{% block breadcrumbs %}
    <div class="breadcrumbs">
    <a href="{% url 'admin:index' %}">{% trans 'Home' %}</a>
    &rsaquo;
    <a href="{% url 'admin:admin_user_changelist' %}">{% trans 'Users' %}</a>
    &rsaquo;
    <a href="{% url 'admin:admin_vouchercode_changelist' %}">{% trans 'Vouchercodes' %}</a>
    &rsaquo;
    Voucher Generator
    </div>
{% endblock %}

{% block extrastyle %}{{ block.super }}<link rel="stylesheet" type="text/css" href="{% static "admin/css/dashboard.css" %}" />{% endblock %}


{% block content %}
<div id="content-main">
{% if request.user.is_active and request.user.is_staff or userobj and userobj.is_active and userobj.is_staff %}
    <h1 id="generator_title">Generate vouchers for {{user}}</h1>
        <form id="formular_generator" action="" method="POST" enctype="multipart/form-data">
            {% csrf_token %}
           <table>{{ form }}</table>
            <button id="generatebutton" type="submit" name="action" value="generate">Generate</input>
        </form>
{% else %}
    <p>{% trans "You don't have permission to access this site." %}</p>
    </div>
{% endif %}

{% endblock %}

{% block sidebar %}
{% endblock %}

完成!

为了将它们导出为 pdf,我使用了管理操作,如下面的 Sumeet Dhariwal 所建议的那样。

【问题讨论】:

  • 这是一次性的吗?
  • 不,应该可以随时从管理界面调用函数

标签: django model admin


【解决方案1】:

你的意思是你需要从管理员中运行一个脚本? 如果是这样,请查看 django-admin-tools http://django-admin-tools.readthedocs.org/en/latest/dashboard.html

【讨论】:

    【解决方案2】:

    找到解决方案: 不,这不是我的意思,因为我想为 1 个特定用户生成优惠券,而不是更多,但这是一个很好的评论。

    【讨论】:

      猜你喜欢
      • 2010-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-09
      • 2023-03-23
      • 2013-03-25
      • 2015-08-01
      • 1970-01-01
      相关资源
      最近更新 更多