编辑: 我决定改变我的问题,希望更普遍的问题更具吸引力......
所以我有一个模型,它有一个M2M字段,它没有在服务器中翻译,但它在客户端。我可以在admin-ui中对此字段进行排序,尤其是每次添加模型的新实例时都会对其进行排序吗?
这是我的最后一次尝试:
感兴趣的模型是:
class Recipe(models.Model):
name = models.CharField(max_length=200,verbose_name=_("name"))
ingredient_list = models.ManyToManyField(IngredientType, through='Ingredient')
class IngredientType(models.Model):
name = models.CharField(max_length=25)
class Ingredient(models.Model):
ingredient_type =models.ForeignKey(IngredientType,verbose_name=_("IngredientType"))
recipe = models.ForeignKey(Recipe)
recipe_admin.py:
class IngredientInline(admin.TabularInline):
model = Ingredient
extra = 1
class RecipeAdmin(admin.ModelAdmin):
inlines = [IngredientInline]
form = RecipeForm
class RecipeForm(forms.ModelForm):
class Meta:
model = Recipe
我在initial_data.json文件中添加了一长串的IngredientType对象。 现在,每当一个人在他的食谱中添加一个新成分时,他就会从打开的长下拉列表中选择一个ingredient_type。
编辑: 在浏览器中查看表单的html时,我的下拉列表中有这些行。 正如您所看到的,在字段下方有一行负责使用showAddAnotherPopup(this)函数向内联添加另一行: (我想以某种方式挂钩该函数,并且每次调用它时,都要调用我的排序函数)
<select id="id_ingredient_set-0-ingredient_type" name="ingredient_set-0-ingredient_type">
<option value="" selected="selected">---------</option>
<option value="42">אבוקדו</option>
<option value="80">אבטיח</option>
....
</select>
<a href="/admin/vcb/ingredienttype/add/" class="add-another" id="add_id_ingredient_set-0-ingredient_type" onclick="return showAddAnotherPopup(this);"> <img src="/static/admin/img/icon_addlink.gif" width="10" height="10" alt="Add another"></a>
我的问题是,动态添加了用户添加到其配方表单中的Ingredient行,导致下拉的ingredient_type名称列表未被排序。我可以按照希伯来语的字母顺序进行排序,但是我已经设法只对页面加载时已经显而易见的行进行排序。
我已经完成了上述操作,将django的tabular.html文件迁移到我的项目文件系统中,并添加了一些对其进行排序的js:
function sortAlpha(a,b){
return a.innerHTML.toLowerCase() > b.innerHTML.toLowerCase() ? 1 : -1;
};
我这样称呼它:
('#id_ingredient_set-0-ingredient_type option')。sort(sortAlpha).appendTo('#id_ingredient_set-0-ingredient_type');
在加载页面时触发的函数内部。 但是这种方法显然不处理用户添加到其配方表单中的所有动态添加的成分行,这导致下拉的成分类型名称列表未排序。 (它挂钩了当前的id)
这是django的showAddAnotherPopup方法,我也将其添加到项目的文件系统中:
function showAddAnotherPopup(triggeringLink) {
var name = triggeringLink.id.replace(/^add_/, '');
name = id_to_windowname(name);
href = triggeringLink.href
if (href.indexOf('?') == -1) {
href += '?_popup=1';
} else {
href += '&_popup=1';
}
var win = window.open(href, name, 'height=500,width=800,resizable=yes,scrollbars=yes');
win.focus();
return false;
}
我是一个django noob,所以我仍然缺乏所有AJAX / js / templatetag热门词汇的知识...... 将非常感谢帮助。 TNX Nitzan
答案 0 :(得分:0)
在您的示例中,您不清楚如何在初始页面加载时触发排序功能,但似乎您需要在添加每个新项目后再次调用该函数。将onclick,onblur或其他事件触发器添加到成分添加方法,该方法将再次调用您的排序功能。
如果您尝试订购由模型表单创建的项目列表,则可以使用元选项order
或order_with_respect_to
。有关详细信息,请参阅https://docs.djangoproject.com/en/dev/ref/models/options/#ordering。