programing

모델의 일부가 아닌 사용자 정의 양식 필드 추가(장고)

instargram 2023. 5. 27. 09:37
반응형

모델의 일부가 아닌 사용자 정의 양식 필드 추가(장고)

관리 사이트에 등록된 모델이 있습니다.필드 중 하나는 긴 문자열 식입니다.관리자에서 이 모델의 추가/업데이트 페이지에 사용자 지정 양식 필드를 추가하고 싶습니다.이 필드의 값을 기반으로 긴 문자열 식을 작성하여 관련 모델 필드에 저장합니다.

어떻게 해야 하나요?

저는 기호들로부터 수학적 또는 문자열 표현을 만들고 있습니다.사용자가 기호(모델의 일부가 아닌 사용자 지정 필드)를 선택하고 저장을 클릭하면 기호 목록에서 문자열 식 표현을 만들어 DB에 저장합니다.저는 기호가 모델과 DB의 일부가 되는 것이 아니라 최종 표현식이 되는 것을 원합니다.

에서.admin.pyforms.py추가할 수 있습니다.ModelForm클래스를 지정한 다음 평소와 같이 추가 필드를 선언합니다.또한 이러한 값을 사용하는 방법에 대한 예를 제시했습니다.form.save():

from django import forms
from yourapp.models import YourModel


class YourModelForm(forms.ModelForm):

    extra_field = forms.CharField()

    def save(self, commit=True):
        extra_field = self.cleaned_data.get('extra_field', None)
        # ...do something with extra_field here...
        return super(YourModelForm, self).save(commit=commit)

    class Meta:
        model = YourModel

관리자에 추가 필드를 표시하려면 다음과 같이 하십시오.

  1. 를 합니다.admin.py위에서 작성한 양식을 참조하도록 양식 속성을 설정합니다.
  2. 필드 또는 필드 집합 선언에 새 필드를 포함합니다.

다음과 같이:

class YourModelAdmin(admin.ModelAdmin):

    form = YourModelForm

    fieldsets = (
        (None, {
            'fields': ('name', 'description', 'extra_field',),
        }),
    )

업데이트:

장고 1.8에서 당신은 추가해야 합니다.fields = '__all__'의 까지.YourModelForm.

행정부에서 하는 것은 가능하지만, 그렇게 간단한 방법은 없습니다.또한, 장고 관리자에게 의존하지 않도록 대부분의 비즈니스 로직을 모델에 유지할 것을 조언하고 싶습니다.

모델에 두 개의 개별 필드가 있으면 더 쉬울 수도 있고 더 좋을 수도 있습니다.그런 다음 이들을 결합하는 방법을 모형에 추가합니다.

예:

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)

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__"

언제든지 새 관리 템플릿을 생성하고 필요한 작업을 수행할 수 있습니다.admin_view(관리자 추가 URL을 무시합니다.admin_view):

url(r'^admin/mymodel/mymodel/add/$','admin_views.add_my_special_model')

두 개의 개별 필드가 아닌 결합된 필드만 모델에 저장하려는 경우 다음과 같은 작업을 수행할 수 있습니다.

저는 이런 일을 해본 적이 없어서 어떻게 될지 잘 모르겠어요.

첫 번째 (최고점) 해결책(https://stackoverflow.com/a/23337009/10843740) 은 정확했지만 더 있습니다.

코드로 필드를 선언하면 해당 솔루션이 완벽하게 작동하지만 동적으로 필드를 구축하려면 어떻게 해야 합니까?

이 경우, 필드 작성__init__의 기능.ModelForm작동하지 않습니다.사용자 지정을 전달해야 합니다.metaclass그리고 그것을 무시합니다.declared_fields에서__new__함수!

다음은 샘플입니다.

class YourCustomMetaClass(forms.models.ModelFormMetaclass):
    """
    For dynamically creating fields in ModelForm to be shown on the admin panel,
        you must override the `declared_fields` property of the metaclass.
    """
    def __new__(mcs, name, bases, attrs):
        new_class = super(NamedTimingMetaClass, mcs).__new__(
            mcs, name, bases, attrs)

        # Adding fields dynamically.
        new_class.declared_fields.update(...)
        return new_class

# don't forget to pass the metaclass
class YourModelForm(forms.ModelForm, metaclass=YourCustomMetaClass):
    """
    `metaclass=YourCustomMetaClass` is where the magic happens!
    """
    # delcare static fields here

    class Meta:
        model = YourModel
        fields = '__all__'

아래와 같이 모델 "MyModel"의 일부가 아닌 사용자 지정 양식 필드 "extra_field"추가했습니다.

# "admin.py"

from django.contrib import admin
from django import forms
from .models import MyModel

class MyModelForm(forms.ModelForm):

    extra_field = forms.CharField()

    def save(self, commit=True):
        extra_field = self.cleaned_data.get('extra_field', None)
        
        # Do something with extra_field here
        
        return super().save(commit=commit)

@admin.register(MyModel)
class MyModelAdmin(admin.ModelAdmin):

    form = MyModelForm

다중 확인 선택 사용자 지정 필드에 대한 이전 응답에서 도움을 받을 수 있습니다.

서로 다른 사용자 정의 필드를 가진 여러 양식을 확장한 다음 인라인 또는 표 형식의 인라인 스택과 같은 인라인 클래스에 할당할 수도 있습니다.

양식 =

이렇게 하면 여러 모델에서 여러 사용자 지정 필드를 추가해야 하는 폼셋 복잡성을 방지할 수 있습니다.

모델 관리자는 다음과 같습니다.

인라인 = [form1dll, form2dll, ...]

여기 링크에 대한 이전 응답에서, 당신은 그것과 저장 방법을 찾을 수 있을 것입니다.

페이지를 볼 때 init가 로드되고 저장하면 데이터베이스로 전송됩니다.

이 두 가지 방법으로 논리를 수행하여 문자열을 추가한 후 저장할 수 있으며 원하는 위치에 따라 Django admin 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',]

...

언급URL : https://stackoverflow.com/questions/17948018/add-custom-form-fields-that-are-not-part-of-the-model-django

반응형