如何在 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 管理员添加可排序的计数列?
如何允许在 Django 管理员中通过自定义 list_display 字段进行排序,该字段没有 DB 字段,也没有可注释