質問

いオブジェクトの編集は、海外のキーオブジェクトBプラスオプションを追加する"他"は次の選択肢のオブジェクトB表示されているオプションか?

私は設定しないユーザーの権利の追加オブジェクトBプラス記号は、継続してご利用可能ですが、私はをクリックでは"アクセス権は拒否されました".での醜い.

を使用していDjango1.0.2

役に立ちましたか?

解決

非推奨ANSWER

Djangoは以来、これが可能になっています。

<時間>

あなたの代わりに、単純にボタンを表示しないようにCSSを使用したと考えられていますか?たぶんそれは少しあまりにもハックです。

これはテストされていないですが、私は考えています...

無addanother-button.cssを

#_addanother { display: none }

admin.py

class YourAdmin(admin.ModelAdmin):
    # ...
    class Media:
        # edit this path to wherever
        css = { 'all' : ('css/no-addanother-button.css',) }
これを行うための

ジャンゴドク - メディア静的定義するとして

注/編集:のドキュメントファイルはMEDIA_URL前に付加されますが、私の実験ではそうではないと言います。あなたの走行距離は異なる場合があります。

あなたはこれがあなたのためのケースで見つけた場合は、

、このための迅速な修正があります...

class YourAdmin(admin.ModelAdmin):
    # ...
    class Media:
        from django.conf import settings
        media_url = getattr(settings, 'MEDIA_URL', '/media/')
        # edit this path to wherever
        css = { 'all' : (media_url+'css/no-addanother-button.css',) }

他のヒント

(この間違った回答に賛成票を投じるのはやめてください!!!)

正誤表 :この答えは基本的に間違っており、OPの質問には答えていません。以下を参照してください。

(これはインラインフォームにのみ適用され、OPが要求した外部キ​​ーフィールドには適用されません)

よりシンプルなソリューション、CSS ハックや Django コードベースの編集は不要です。

これを Inline クラスに追加します。

max_num=0

アップデート

これはOPの質問には答えず、インラインフォームの「関連追加」ボタンを非表示にするのにのみ役立ち、要求された外部キーを非表示にするのには役立ちません。

この回答を書いたとき、IIRC が受け入れた回答は両方を非表示にしたため、混乱してしまいました。

次のリンクが解決策を提供しているようです(ただし、特にインラインフォームのFKの「別の追加」ボタンの場合は、CSSを使用して非表示にすることが最も現実的だと思われます)。

Django 1.7 のインラインフォームから [追加] ボタンを削除する

ここで言及したソリューションのほとんどはそれをやって別のクリーンな方法があり、動作しますが。他の解決策が提示された後、おそらくそれは、Djangoの後のバージョンで導入されました。 (私は現在、Djangoの1.7を使用しています)。

"追加別の" オプションを削除するには、

class ... #(Your inline class)

    def has_add_permission(self, request):
        return False

同様に無効にしたい場合は、「削除しますか?」オプション、インラインクラスに次のメソッドを追加します。

    def has_delete_permission(self, request, obj=None):
        return False

N.B。 Djangoの1.5.2のため、おそらく古い作品。 can_add_relatedプロパティのは約2年前にに登場します。

私が見つけた最良の方法は、あなたのModelAdminののget_form関数をオーバーライドすることです。私の場合は、現在のユーザーでログインするポストの著者を強制したかったです。豊富なコメントを以下のコード。本当に重要なビットはwidget.can_add_relatedの設定です。

def get_form(self,request, obj=None, **kwargs):
    # get base form object    
    form = super(BlogPostAdmin,self).get_form(request, obj, **kwargs)

    # get the foreign key field I want to restrict
    author = form.base_fields["author"]

    # remove the green + by setting can_add_related to False on the widget
    author.widget.can_add_related = False

    # restrict queryset for field to just the current user
    author.queryset = User.objects.filter(pk=request.user.pk)

    # set the initial value of the field to current user. Redundant as there will
    # only be one option anyway.
    author.initial = request.user.pk

    # set the field's empty_label to None to remove the "------" null 
    # field from the select. 
    author.empty_label = None

    # return our now modified form.
    return form
get_formここで変更を行うの興味深い部分はauthor.widgetは、あなたがしようとdjango.contrib.admin.widgets.RelatedFieldWidgetWrapper関数のいずれかに変更を加えるかのように、ウィジェットが実際のフォームウィジェットのインスタンスであるformfield_for_xxxxxのインスタンスは、この典型的に、ということですForeignKeyの場合、それはdjango.forms.widgets.Selectです。

django.contrib.admin.options.pyを見て、BaseModelAdminクラスをチェックアウトし、formfield_for_dbfield方式ます。

あなたはこれを確認します

# For non-raw_id fields, wrap the widget with a wrapper that adds
# extra HTML -- the "add other" interface -- to the end of the
# rendered output. formfield can be None if it came from a
# OneToOneField with parent_link=True or a M2M intermediary.
if formfield and db_field.name not in self.raw_id_fields:
    formfield.widget = widgets.RelatedFieldWidgetWrapper(formfield.widget, db_field.rel, self.admin_site)

私は、あなたの最善の策は、(順番にModelAdminのサブクラスである)BaseModelAdminのサブクラスを作成していると思う新しいクラス、オーバーライドformfield_fo_dbfieldであなたのモデルをベースとそれを作るようにそれはない/または条件付きでウィジェットをラップしますRelatedFieldWidgetWrapperインチ

一つは、関連オブジェクトを追加する権限を持っていないユーザーがいる場合は、RelatedFieldWidgetWrapperは追加リンクを表示してはならないと主張するだろうか?多分これはジャンゴのtracする

に言及に値する何かであります

私は次のアプローチを使用します 形状 そして インラインフォーム

ジャンゴ 2.0、Python 3+

形状

class MyModelAdmin(admin.ModelAdmin):
    #...
    def get_form(self,request, obj=None, **kwargs):

        form = super().get_form(request, obj, **kwargs)
        user = form.base_fields["user"]

        user.widget.can_add_related = False
        user.widget.can_delete_related = False
        user.widget.can_change_related = False

        return form  

インラインフォーム

class MyModelInline(admin.TabularInline):
    #...
    def get_formset(self, request, obj=None, **kwargs):

        formset = super().get_formset(request, obj, **kwargs)
        user = formset.form.base_fields['user']

        user.widget.can_add_related = False
        user.widget.can_delete_related = False
        user.widget.can_change_related = False

        return formset

その答えによる @Slipstreamどのよう 実施のための溶液に、moの出の属性のformfieldのウィジェットが、私の意見では、 get_form ではないの論理的な場所ではないかと思います。

その答えによる @cethegeek場所 実施のための溶液に、moのに延長 formfield_for_dbfield, ず明確な例です。

を利用する理由 formfield_for_dbfield?その docstring この指定用フックゴ形成分野:

フックを指定するためのフォームフィールドインスタンスの指定されたデータベースフィールドインスタンス.

ことができます(若干)クリーンでより明確にコード、および、ボーナスパーツとしては、簡単にセット追加的 Field 属性, など initial 価値および/または disabled (例 こちらのは、追加したり、 kwargs (呼び出しの前に super).

なので、組み合わせの回答を想定したOPのモデル ModelAModelB, の ForeignKey モデルの分野名 b):

class ModelAAdmin(admin.ModelAdmin):
    def formfield_for_dbfield(self, db_field, request, **kwargs):
        # optionally set Field attributes here, by adding them to kwargs
        formfield = super().formfield_for_dbfield(db_field, request, **kwargs)
        if db_field.name == 'b':
            formfield.widget.can_add_related = False
            formfield.widget.can_change_related = False
            formfield.widget.can_delete_related = False
        return formfield

# Don't forget to register...
admin.site.register(ModelA, ModelAAdmin)

注意:の場合 ForeignKey モデル分野 on_delete=models.CASCADE, は、 can_delete_related 属性 False デフォルトでは、どの のための RelatedFieldWidgetWrapper.

私は Django 2.x を使用していますが、少なくとも私の場合は最良の解決策を見つけたと思います。

HTMLファイルの「保存して別の追加」ボタンがオンになっています your_python_installation\Lib\site-packages\django\contrib\admin\templates\admin\subtmit_line.html.

  1. そのHTMLファイルをコピーして、次のようにプロジェクトに貼り付けます your_project\templates\admin\submit_line.html.
  2. それを開いて、必要に応じてボタンのコードをコメント/削除します。

{#{% if show_save_and_add_another %}<input type="submit" value="{% trans 'Save and add another' %}" name="_addanother" />{% endif %}#}

この問題はすでに解決されていると思います。しかし、将来誰かが私と同じようなケースを経験するかもしれません。

私はこの作らcethegeek回答に基づいて

class SomeAdmin(admin.ModelAdmin):
    form = SomeForm

    def formfield_for_dbfield(self, db_field, **kwargs):
        formfield = super(SomeAdmin, self).formfield_for_dbfield(db_field, **kwargs)
        if db_field.name == 'some_m2m_field':
            request = kwargs.pop("request", None)
            formfield = self.formfield_for_manytomany(db_field, request, **kwargs)  # for foreignkey: .formfield_for_foreignkey
            wrapper_kwargs = {'can_add_related': False, 'can_change_related': False, 'can_delete_related': False}
            formfield.widget = admin.widgets.RelatedFieldWidgetWrapper(
                formfield.widget, db_field.remote_field, self.admin_site, **wrapper_kwargs
            )
        return formfield

django.contrib.admin.widgets.py

(Djangoはディレクトリをインストールします)/django/contrib/admin/widgets.py:ライン239およびライン244の間のすべてをコメントます:

 if rel_to in self.admin_site._registry: # If the related object has an admin interface:
        # TODO: "id_" is hard-coded here. This should instead use the correct
        # API to determine the ID dynamically.
        output.append(u'<a href="%s" class="add-another" id="add_id_%s" onclick="return showAddAnotherPopup(this);"> ' % \
            (related_url, name))
        output.append(u'<img src="%simg/admin/icon_addlink.gif" width="10" height="10" alt="%s"/></a>' % (settings.ADMIN_MEDIA_PREFIX, _('Add Another')))
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top