Django FormView 에 kwargs 사용자변수 추가하기

가끔 초기화 할때, 내가 원하는 변수 값을 넘기고 싶을때 kwargs 에 넣어줘서 넘겨줄 수 있다.

코드를 일단 보자

class ProductUpdateView(BSModalUpdateView):
    model = Product
    template_name = "_modal_update.html"
    form_class = ProductUpdateForm
    success_message = "변경완료"
    # success_url = reverse_lazy('orderitem_list')
    def get_success_url(self):
        return self.request.META["HTTP_REFERER"]

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        print("===여기 들어옴 ProductUpdateView ===", args, kwargs)

    def get_form_kwargs(self):
        kwargs = super().get_form_kwargs()
        kwargs["request"] = self.request
        return kwargs

일단, get_form_kwargs(self) 함수가 있다는 사실이 중요하다.

여기에서 기본 값들을 받고, 사용자 변수를 추가하고 리턴해주면 사용자 값이 추가된 kwargs 를 넘길 수 있다.

사용되는 부부은 이런 곳이다.


class ProductUpdateForm(BSModalModelForm):
    title = ""

    class Meta:
        model = Product
        fields = ["company", "name"]

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        # print("=== ProductUpdateForm ===", args, kwargs, kwargs["request"])

__init__() 함수가 불려질때 넘어오게 되는 kwargs 에 내가 추가한 변수가 떡하니 들어 있다.

유용하게 활용하자.

![bird's eye view photography of trees and body of water](assets/images/2023/03/mawu2pojwfu.jpg?resize=1024%2C576&ssl=1)

참고페이지

https://ggodong.tistory.com/209 – Get, Post 요청을 모두 알아서 처리하는 FormView !

https://stackoverflow.com/questions/18605008/curious-about-get-form-kwargs-in-formview

Django forms fields widgets 사용 예제

항상 하는데 항상 헷갈려

Fields 와 Widget 은 궁합이 있는데 쌍으로 움직여야 제대로 나온다.

![](assets/images/2023/03/image-1.png?resize=785%2C611&ssl=1)

아래 코드로 나온 모양들이다. 여러가지 위젯이 쓰이고 있다.

class FirmwareUpdateForm(BSModalModelForm):
    is_fileinclue = "enctype=multipart/form-data"
    title = ""

    class Meta:
        model = Firmware
        fields = ["company", "desc", "dtype", "content", "filename", "version", "publish", "channelfw_type", "date_release", "products"]
        labels = {
            "company": _("*회사명"),
            "desc": _("설명"),
            "dtype": _("타입"),
            "filename": _("파일명"),
            "content": _("파일"),
        }
        widgets = {
            "company": forms.Select(attrs={"class": "form-select"}),
            "desc": forms.TextInput(attrs={"class": "form-control", "placeholder": "설명"}),
            "dtype": forms.Select(attrs={"class": "form-select", "placeholder": "타입"}),
            "filename": forms.TextInput(attrs={"class": "form-control", "placeholder": "읽기전용-자동입력됩니다", "readonly": "readonly"}),
            # "content": forms.FileInput(attrs={"class": "form-control", "placeholder": "첨부파일"}),
            "version": forms.TextInput(attrs={"class": "form-control"}),
            "publish": forms.CheckboxInput(attrs={"class": "form-check"}),
            "channelfw_type": forms.Select(attrs={"class": "form-select"}),
            "date_release": forms.DateTimeInput(attrs={"type": "datetime-local", "class": "form-control"}),
            "products": forms.SelectMultiple(attrs={"class": "form-control"}),
        }

특히, 날짜 시간 입력 받는 부분을 참고해두고 나중에 활용하자.

type을 datetime-local 이런게 있는줄 몰랐네

보통 date 는 많이 썼는데,

“date_release”: forms.DateTimeInput(attrs={“type”: “datetime-local”, “class”: “form-control”})

참고한 사이트는 여기 https://www.letscodemore.com/blog/how-to-add-date-input-widget-in-django-forms/

실제 자세한 내용은 당연하게도 공식 사이트로

https://docs.djangoproject.com/en/4.1/ref/forms/widgets/

  • Widgets handling input of text
    TextInput
    NumberInput
    EmailInput
    URLInput
    PasswordInput
    HiddenInput
    DateInput
    DateTimeInput
    TimeInput
    Textarea
  • Selector and checkbox widgets
    CheckboxInput
    Select
    NullBooleanSelect
    SelectMultiple
    RadioSelect
    CheckboxSelectMultiple
  • File upload widgets
    FileInput
    ClearableFileInput
  • Composite widgets
    MultipleHiddenInput
    SplitDateTimeWidget
    SplitHiddenDateTimeWidget
    SelectDateWidget

이름만 알아도 머 상상은 쉽게 되니깐

Django forms fields 와 헷갈리면 안된다. 필드의 속성을 정의하는 fields 도 맞춰서 잘 써야 한다.

https://docs.djangoproject.com/en/4.1/ref/forms/fields/

맵핑 테이블을 아래와 같이 정리해둔 곳이 있네, 이 테이블을 보는게 편하겠다.

https://www.letscodemore.com/blog/how-to-add-date-input-widget-in-django-forms/

| Name | Class | HTML Input | |---|---|---| | [BooleanField](https://www.geeksforgeeks.org/booleanfield-django-forms/) | class BooleanField(\*\*kwargs) | CheckboxInput | | [CharField](https://www.geeksforgeeks.org/charfield-django-forms/) | class CharField(\*\*kwargs) | TextInput | | [ChoiceField](https://www.geeksforgeeks.org/choicefield-django-forms/) | class ChoiceField(\*\*kwargs) | Select | | [TypedChoiceField](https://www.geeksforgeeks.org/typedchoicefield-django-forms/) | class TypedChoiceField(\*\*kwargs) | Select | | [DateField](https://www.geeksforgeeks.org/datefield-django-forms/) | class DateField(\*\*kwargs) | DateInput | | [DateTimeField](https://www.geeksforgeeks.org/datetimefield-django-forms/) | class DateTimeField(\*\*kwargs) | DateTimeInput | | [DecimalField](https://www.geeksforgeeks.org/decimalfield-django-forms/) | class DecimalField(\*\*kwargs) | NumberInput when Field.localize is False, else TextInput | | [DurationField](https://www.geeksforgeeks.org/durationfield-django-forms/) | class DurationField(\*\*kwargs) | TextInput | | [EmailField](https://www.geeksforgeeks.org/emailfield-django-forms/) | class EmailField(\*\*kwargs | EmailInput | | [FileField](https://www.geeksforgeeks.org/filefield-django-forms/) | class FileField(\*\*kwargs) | ClearableFileInput | | [FilePathField](https://www.geeksforgeeks.org/filepathfield-django-forms/) | class FilePathField(\*\*kwargs) | Select | | [FloatField](https://www.geeksforgeeks.org/floatfield-django-forms/) | class FloatField(\*\*kwargs) | NumberInput when Field.localize is False, else TextInput | | [ImageField](https://www.geeksforgeeks.org/imagefield-django-forms/) | class ImageField(\*\*kwargs) | ClearableFileInput | | [IntegerField](https://www.geeksforgeeks.org/integerfield-django-forms/) | class IntegerField(\*\*kwargs) | NumberInput when Field.localize is False, else TextInput | | [GenericIPAddressField](https://www.geeksforgeeks.org/genericipaddressfield-django-forms/) | class GenericIPAddressField(\*\*kwargs) | TextInput | | [MultipleChoiceField](https://www.geeksforgeeks.org/multiplechoicefield-django-forms/) | class MultipleChoiceField(\*\*kwargs) | SelectMultiple | | [TypedMultipleChoiceField](https://www.geeksforgeeks.org/typedmultiplechoicefield-django-forms/) | class TypedMultipleChoiceField(\*\*kwargs) | SelectMultiple | | [NullBooleanField](https://www.geeksforgeeks.org/nullbooleanfield-django-forms/) | class NullBooleanField(\*\*kwargs) | NullBooleanSelect | | [RegexField](https://www.geeksforgeeks.org/regexfield-django-forms/) | class RegexField(\*\*kwargs) | TextInput | | [SlugField](https://www.geeksforgeeks.org/slugfield-django-models/) | class SlugField(\*\*kwargs) | TextInput | | [TimeField](https://www.geeksforgeeks.org/timefield-django-forms/) | class TimeField(\*\*kwargs) | TimeInput | | [URLField](https://www.geeksforgeeks.org/urlfield-django-forms/) | class URLField(\*\*kwargs) | URLInput | | [UUIDField](https://www.geeksforgeeks.org/uuidfield-django-forms/) | class UUIDField(\*\*kwargs) | TextInput |