2014-07-25 28 views
1

我在django管理员(v1.6)中有一个主题模型。我试图做一个采取查询集并制作另一个主题的对象别名的操作。该其他主题将在intermediate page中选择。我很难理解如何让Raw ID input进入中间页面,我还没有看到任何这样的代码。Django管理员 - 中间页面上的Raw Id输入

这里是我的模型

class Topic(models.Model): 
    name = models.CharField(max_length=200) 
    slug = models.SlugField(max_length=200, unique=True) 

class Alias(models.Model): 
    name = models.CharField(max_length=200) 
    slug = models.SlugField(max_length=200, unique=True) 
    topic = models.ForeignKey(Topic, related_name='aliases') 

我的admin.py是这样的:

from django.template.response import TemplateResponse 
from breakingnews.topics.models import Topic, Alias 

class TopicAdmin(admin.ModelAdmin): 
    def make_alias(self, request, queryset): 
     if request.POST.get('post'): 
      # process the queryset here 
      head = request.POST.get('head') 
      tail = queryset 

      for topic in tail: 
       a, is_new = Alias.objects.get_or_create(name=topic.name, slug=topic.slug, topic=head) 
     else: 
      context = { 
       'title': "To what topic would you like the alias to point?", 
       'queryset': queryset, 
       'action_checkbox_name': helpers.ACTION_CHECKBOX_NAME, 
      } 
      return TemplateResponse(request, 'admin/make_alias.html', 
       context, current_app=self.admin_site.name) 
    add_tag.short_description = "Make these topics an alias to another" 

    ... 

    actions = [ 
     add_tag, 
    ] 
admin.site.register(Topic, TopicAdmin) 

而且make_alias.html是这样的:

{% extends "admin/base_site.html" %} 
{% load i18n l10n admin_urls %} 

{% block content %} 
<p>{% blocktrans %}To what topic would you like the alias to point? {% endblocktrans %}</p> 
<ul>{{ queryset|unordered_list }}</ul> 

<form action="" method="post">{% csrf_token %} 
    <div> 
    <input type="text" name="head" value="" /> 
    {% for obj in queryset %} 
    <input type="hidden" name="{{ action_checkbox_name }}" value="{{ obj.pk|unlocalize }}" /> 
    {% endfor %} 
    <input type="hidden" name="action" value="make_alias" /> 
    <input type="hidden" name="post" value="yes" /> 
    <input type="submit" value="Confirm" /> 
    </div> 
    <!-- <ul>{{ queryset|unordered_list }}</ul> --> 

</form> 
{% endblock %} 
+0

你有一个admin.py文件? –

+0

是的,我喜欢。对不起,我目前的工作没有准确的代表,我会尽我所能继续编辑有用的信息。我很喜欢添加动作,但对我来说,最大的障碍是获取中间形式的raw_id_input样式选择器。 – Alex

回答

0

这里发生了什么事使其工作:

这个添加到Admin.py:

from django.template.response import TemplateResponse 
from breakingnews.topics.models import Topic, Alias 

class AliasCreateForm(forms.ModelForm): 
    parents = forms.ModelChoiceField(
     queryset=Topic.objects.all(), 
     widget=ManyToManyRawIdWidget(
      Topic._meta.get_field('parents').rel, admin.site) 
    ) 

    class Meta: 
     model = Topic 
     fields = ('parents',) 

def make_alias(self, request, queryset): 
    if request.POST.get('post'): 
     # Handle the response 
    else: 
     formset = AliasCreateForm() 
     context = { 
      'title': "To what topic would you like the alias to point?", 
      'queryset': queryset, 
      'formset': formset, 
      'action_checkbox_name': helpers.ACTION_CHECKBOX_NAME, 
      'action':'make_alias', 
     } 
     return TemplateResponse(request, 'admin/make_alias.html', 
           context, current_app=self.admin_site.name) 
make_alias.short_description = "Make these topics an alias to another" 

而且make_alias.html:

{% extends "admin/base_site.html" %} 
{% load i18n l10n admin_urls %} 

{% block extrahead %} 
<script type="text/javascript" src="/static/admin/js/admin/RelatedObjectLookups.js"></script> 
{% endblock %} 

{% block content %} 
<form action="" method="post">{% csrf_token %} 
    <ul>{{ queryset|unordered_list }}</ul> 
{{ formset }} 

<br /><br /> 
{% for obj in queryset %} 
<input type="hidden" name="{{ action_checkbox_name }}" value="{{ obj.pk|unlocalize }}" /> 
{% endfor %} 
<input type="hidden" name="action" value="{{action}}" /> 
<input type="hidden" name="post" value="yes" /> 
<input type="submit" value="Submit" /> 
</form> 

{% endblock %}