如何在Django Admin中执行此操作。用箭头控制位置

时间:2011-08-10 11:06:10

标签: django django-admin

我使用名为“website_position”的字段来控制网址的位置。这是一个整数字段。

我使用的模型是这样的:     来自django.db导入模型     导入日期时间

class Directory(models.Model):
 website_name = models.CharField(max_length=200)
 website_url = models.CharField(max_length=200)
 website_position = models.IntegerField()
 pub_date = models.DateTimeField('date published')

现在我将用数据填充数据库:

website_name | website_url                    | website_position | pub_date
Google       | http://www.google.com          | 1                | 10-08-2011
Yahoo        | http://www.yahoo.com           | 2                | 10-08-2011
Altavista    | http://www.altavista.com       | 3                | 10-08-2011

这个输出将是:Google,Yahoo,Altavista

另一个例子:(这里我将重新排序链接位置)

website_name | website_url                    | website_position | pub_date
Google       | http://www.google.com          | 3                | 10-08-2011
Yahoo        | http://www.yahoo.com           | 2                | 10-08-2011
Altavista    | http://www.altavista.com       | 1                | 10-08-2011

Ant的输出将是:Altavista,Yahoo,Google

这里的事情是我控制Django中链接的位置 管理员在字段“website_position”中使用整数。我想知道 如果Django Admin有更好的方法来解决这个问题。有可能 用箭头控制这个以改变链接的位置,我点击 在向上箭头和链接上升...我点击向下箭头和 链接断开......这可以在Django Admin中使用吗?

最诚挚的问候,

2 个答案:

答案 0 :(得分:1)

答案 1 :(得分:0)

我在视图中基本上做同样的事情,而不是在管理员中。除了我必须处理子组和不同的深度。我的方法不花哨,没有ajax或javascript或任何异步。基本上我写了函数,然后从链接到GET参数调用它们。 它非常粗糙,但似乎非常一致。

def someview(request):
    directory_query = Directory.objects.all().order_by('website_position') 
    #or whatever you need to query here, order_by is important

    if 'f' in request.GET and 'id' in request.GET:
        function = request.GET['f']
        target_id = request.GET['id']
        order_functions(request, function, target_id, directory_query)
        return HttpResponseRedirect('/current_url/') #using a target instead of "" clears GET
    return render_to_response('template.html', locals, context_instance=RequestContext(request),)

def order_functions(request, function, target_id, directory_query):
    target_obj = directory_query.get(id=target_id)
    target_index = directory_query.index(target_obj)
    max_position = len(directory_query)
    min_position = 1

    if target_index < (max_position - 1): #indexes start at 0, so have to subtract 1 from len
        obj_above = directory_query[target_index + 1]
    else:
        obj_above = None

    if target_index > 0:
        obj_below = directory_query[target_index - 1]
    else:
        obj_below = None

    if function == 'order_inc':
        if target_obj.website_position < max_position:
            target_obj.website_position += 1
            obj_above.website_position += -1
            target_obj.save()
            obj_above.save()

    if function == 'order_dec':
        if target_obj.website_position > min_position:
            target_obj.website_position += -1
            obj_below.website_position += 1
            target_obj.save()
            obj_below.save()

    return

#your template:
{% for item in directory_query %}
    <li>{{ item.website_position }}
        <input onclick="window.location.href='?f=order_dec&amp;id={{ item.id }}'" type='button' value='increase' />
        <input onclick="window.location.href='?f=order_inc&amp;id={{ item.id }}'" type='button' value='decrease' /> 
    </li>
{% endfor %}

我确信有更简洁的方法,你仍然需要弄清楚如何将其添加到管理员。