128

管理サイトにモデルを登録しています。そのフィールドの 1 つが長い文字列式です。管理画面で、このモデルの追加/更新ページにカスタム フォーム フィールドを追加したいと思います。これらのフィールドの値に基づいて、長い文字列式を作成し、関連するモデル フィールドに保存します。

これどうやってするの?

シンボルから数式または文字列式を作成しています。ユーザーがシンボル (モデルの一部ではないカスタム フィールド) を選択し、[保存] をクリックすると、シンボルのリストから文字列式表現が作成され、DB に保存されます。シンボルをモデルと DB の一部にするのではなく、最終的な式のみにしたいのです。

4

6 に答える 6

46

管理者で行うことは可能ですが、それほど簡単な方法はありません。また、Django Admin に依存しないように、ほとんどのビジネス ロジックをモデルに保持することをお勧めします。

モデルに 2 つの別個のフィールドがあれば、より簡単になるかもしれません (さらに良いかもしれません)。次に、それらを結合するモデルにメソッドを追加します。

例えば:

class MyModel(models.model):

    field1 = models.CharField(max_length=10)
    field2 = models.CharField(max_length=10)

    def combined_fields(self):
        return '{} {}'.format(self.field1, self.field2)

combined_fields()次に、管理者で読み取り専用フィールドとして追加できます。

class MyModelAdmin(models.ModelAdmin):

    list_display = ('field1', 'field2', 'combined_fields')
    readonly_fields = ('combined_fields',)

    def combined_fields(self, obj):
        return obj.combined_fields()

combined_fieldsデータベースに保存する場合は、モデルを保存するときに保存することもできます。

def save(self, *args, **kwargs):
    self.field3 = self.combined_fields()
    super(MyModel, self).save(*args, **kwargs)
于 2013-07-30T13:35:46.970 に答える
10

Django 2.1.1 主な回答により、質問への回答の途中でした。結果を実際のモデルのフィールドに保存するのには役立ちませんでした。私の場合、ユーザーがデータを入力できるテキストフィールドが必要でした。保存が発生すると、データが処理され、結果がモデルのフィールドに入れられて保存されました。元の回答は余分なフィールドから値を取得する方法を示していましたが、少なくともDjango 2.1.1ではモデルに値を保存する方法を示していませんでした

これは、バインドされていないカスタム フィールドから値を取得し、処理して、実際の説明フィールドに保存します。

class WidgetForm(forms.ModelForm):
    extra_field = forms.CharField(required=False)

    def processData(self, input):
        # example of error handling
        if False:
            raise forms.ValidationError('Processing failed!')

        return input + " has been processed"

    def save(self, commit=True):
        extra_field = self.cleaned_data.get('extra_field', None)

        # self.description = "my result" note that this does not work

        # Get the form instance so I can write to its fields
        instance = super(WidgetForm, self).save(commit=commit)

        # this writes the processed data to the description field
        instance.description = self.processData(extra_field)

        if commit:
            instance.save()

        return instance

    class Meta:
        model = Widget
        fields = "__all__"
于 2018-09-21T18:41:00.457 に答える
4

いつでも新しい管理テンプレートを作成し、必要なことを行うことができますadmin_view(管理追加 URL を にオーバーライドしますadmin_view)。

url(r'^admin/mymodel/mymodel/add/$','admin_views.add_my_special_model')
于 2014-08-21T08:38:23.277 に答える
3

2 つの個別のフィールドではなく、結合されたフィールドのみをモデルに格納したい場合は、次のようにすることができます。

私はこのようなことをしたことがないので、それがどのように機能するかは完全にはわかりません.

于 2013-07-30T14:26:58.897 に答える
0

あなたは私の答えから助けを得るかもしれません: multicheckchoiceカスタムフィールドに関する以前の私の答え

異なるカスタム フィールドを持つ複数のフォームを拡張して、stackedinline や tabularinline などのインライン クラスに割り当てることもできます。

フォーム =

このようにして、複数のモデルから複数のカスタム フィールドを追加する必要があるフォームセットの複雑さを回避できます。

あなたのモデル管理者は次のようになります:

インライン = [フォーム 1 インライン、フォーム 2 インライン、...]

ここのリンクに対する以前の回答では、init メソッドと save メソッドが見つかります。

ページを表示するとinitがロードされ、保存するとデータベースに送信されます。

これらの 2 つの方法では、ロジックを実行して文字列を追加し、その後保存して、必要な場所に応じて Django 管理者の change_form または change_list で表示することができます。list_display は、change_list にフィールドを表示します。それが役立つかどうか教えてください... ....

class CohortDetailInline3(admin.StackedInline):
    model = CohortDetails
    form =  DisabilityTypesForm
...

class CohortDetailInline2(admin.StackedInline):
    model = CohortDetails
    form =  StudentRPLForm

... ... ...

@admin.register(Cohort)
class CohortAdmin(admin.ModelAdmin):         
        form = CityInlineForm
        inlines = [uploadInline,   cohortDetailInline1,
        CohortDetailInline2, CohortDetailInline3]
    
        list_select_related = True
    
        list_display = ['rto_student_code', 'first_name', 'family_name',]

...

于 2021-10-29T05:51:01.293 に答える