如何在 Django 管理员中配置重新排序 order_with_respect_to 项目?

Posted

技术标签:

【中文标题】如何在 Django 管理员中配置重新排序 order_with_respect_to 项目?【英文标题】:How to configure reordering order_with_respect_to items in the Django admin? 【发布时间】:2020-04-30 06:57:14 【问题描述】:

我正在尝试使用 order_with_respect_to Django Meta option 并在管理员中重新排序项目。

我找到了https://github.com/bfirsh/django-ordered-model,但他们似乎没有使用原生 Django API。

你知道有人向 Django 管理员添加了这种重新排序功能吗?

模型如下所示:

from django.db import models

class Question(models.Model):
    text = models.TextField()

class Answer(models.Model):
    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    text = models.TextField()

    class Meta:
        order_with_respect_to = 'question'

我希望能够重新排序管理员的答案。

【问题讨论】:

你的模型/管理类是什么样的?它的行为与你想要的有什么不同? 我加了一个例子。 我也遇到过这个问题。 Django 假设您永远不想重新排序“答案”,只需将它们保持与创建时相同的顺序即可。我的解决方法是在模型上添加我自己的字段,名为“order”,使其成为整数字段,然后在其 admin.TabularInline 类上覆盖 get_queryset() 以按“order”排序。 【参考方案1】:

我不知道这是否是最好的方法,但它似乎有效: 您可以向管理员提供您自己的 ModelForm,包括一个额外的字段(例如:django-admin-add-custom-form-fields-that-are-not-part-of-the-model)。

上述示例的代码可能如下所示(forms.py):

from django import forms

from .models import Question

class QuestionAdminForm(forms.ModelForm):
    assign_order = forms.CharField(
        max_length=50,
        help_text=("Enter order of ids in comma separated list, "
                   "e.g. '0,1,2,3'")
        )

    def save(self, commit=True):
        instance = super().save(commit)
        assign_order = self.cleaned_data.get('assign_order', None)
        order_list = [int(num) for num in assign_order.split(',')]
        instance.set_answer_order(order_list)
        if commit:
            instance.save()
        return instance

    class Meta:
        model = Question
        fields = '__all__'

【讨论】:

以上是关于如何在 Django 管理员中配置重新排序 order_with_respect_to 项目?的主要内容,如果未能解决你的问题,请参考以下文章

如何重新排序 Django-Graphene 子查询?

url查询中的Django自定义排序

如何向具有多对一关系的模型的 Django 管理员添加可排序的计数列?

如何允许在 Django 管理员中通过自定义 list_display 字段进行排序,该字段没有 DB 字段,也没有可注释

Django 管理员:自定义排序

envfit结果如何创建?