django admin 内で、別のテーブルと 1 対多の関係を持つ管理モデルを作成しています。Recipes
と呼びましょうIngredients
。各レシピには複数の材料があります。
管理ページで、ユーザーがレシピを作成し、同じページで特定の材料を追加できるようにしたいと考えています。だから私はの概念を使用していinline models
ます。問題は、特定の成分が作成されると、いくつかのフィールドのみを編集できるようにする必要があることです。そこで、2 つの個別のインライン モデルを作成しました。1 つは編集用、もう 1 つは追加用です。
もう 1 つの問題は、ユーザーが特定の権限を持っている場合にのみ成分の作成を実行できることです。ユーザーがこれらの権限を持っていない場合でも、成分は作成されますが、そうではありませんpublished
。後で、適切な権限を持つ人から承認を受ける必要があります。現在formset
、成分を作成するために をオーバーライドしています。次のようになります。
class AddIngredientInlineFormset(forms.models.BaseInlineFormSet):
model = Ingredient
def save(self, commit=True):
can_publish = self.request.user.has_perm('meals.publish_ingredient')
for form in self.forms:
if form.cleaned_data:
Ingredient.objects.create(
is_published = can_publish, **kwargs
)
class AddIngredientInline(admin.StackedInline):
model = Ingredient
formset = AddIngredientInlineFormset
fields = ['name', 'amount', 'description']
extra = 1
def has_change_permission(self, request):
return False
次に、編集用の別のインライン クラスがあります。
class EditIngredientInline(admin.StackedInline):
model = Ingredient
fields = ['name', 'amount', 'description']
readonly_fields = ['name', 'amount']
extra = 0
can_delete = False
def has_add_permission(self, request):
return False
次に、私のレシピ管理モデルでは、次のようになります。
class RecipeAdmin(BaseModelAdmin):
model = models.Recipe
list_display = ['name']
def add_view(self, request, form_url='', extra_context={}):
self.inlines = [AddIngredientInline]
return super(BaseModelAdmin, self).add_view(request, form_url, extra_context)
def change_view(self, request, object_id, form_url='', extra_context={}):
self.inlines = [EditIngredientInline, AddIngredientInline]
return super(BaseModelAdmin, self).change_view(request, object_id, form_url, extra_context)
これは、レシピとそれらのレシピの材料を追加するのにうまく機能し、ディスプレイはすべてに対してうまく表示されます. ただし、特定のレシピの既存の材料を編集しようとすると、エラーが発生します。IngredientFormFormSet' object has no attribute 'new_objects'
formset.save()
を使用していないため、これが起こっていると思いますAddIngredientFormSet
。また、これはかなり複雑になり始めているため、インライン成分を公開するための許可を確認し、その列を正しく保存するためのより良い方法があるかどうか疑問に思っています.