Django – ModelForm field 초기값 설정하기

ModelForm init 함수에서 특정 필드값 초기값 주는 방법, 아래 글에 자세히 나와 있습니다.

Django set field value after a form is initialized

핵심은 initial 이라는 키워드

form.field["필드이름"].initial = 원하는값

이렇게 주면 된다.

많이들 아는 queryset 으로 Foreign Key로 연결된 테이블 값을 필터링 하는 방법은 많이 알고 있으니 머 생략하지만, 초기값을 막상 주려니 또 검색하게 되었다. 여기에 남겨둠

__init__ 오버라이딩 코드도 참고로 남겨둔다.

class ChooseProjectForm(forms.Form):    project = forms.ModelChoiceField(queryset=project_qs)    my_projects = forms.BooleanField()    def __init__(self, *args, **kwargs):        super(ChooseProjectForm, self).__init__(*args, **kwargs)        self.data = self.data.copy()  # IMPORTANT, self.data is immutable        # any condition:        if self.data.get('my_projects'):            my_projects = self.fields['project'].queryset.filter(my=True)            self.fields['project'].queryset = my_projects            self.fields['project'].initial = my_projects.first().pk            self.fields['project'].empty_label = None  # disable "-----"            self.data.update(project=my_projects.first().pk)  # Update Form data            self.fields['project'].widget = forms.HiddenInput()  # Hide if you want
  • empty_label – 빈 값 조정
  • forms.HiddenInput()
  • widget 지정

코드에서 이런 내용들을 살펴볼 수 있다. 공부하자!!

Django – CreateView form_valid() 오버라이딩

CreateView 저장 작업을 할때 커스텀 동작이 필요하다면, form_valid()를 오버라이딩해서 그냥 여기서 저장해 버리는 방법이 있다.

View를 쓴다는게 좀 커스텀 동작을 제약하는 경우와 편리성을 바꾸는 것이니 만큼 좀 불편해도 이렇게라도 변경해서 쓰자. 기본 코드는 아래와 같다.

def form_valid(self, form):    self.object = form.save()    # do something with self.object    # remember the import: from django.http import HttpResponseRedirect    return HttpResponseRedirect(self.get_success_url())

self.object 에 form 데이터가 일단 저장되고, 이 값을 이용해서 원하는 동작을 수행한다. 그리고 코드에는 get_success_url() 로 redirect 하고 있지만 원하는 어디든 보내면 된다.

내 작업에 작성한 코드도 일단 올려둔다. **많이 쓰이는 request 객체는 self.request 로 접근이 가능해서 코드 작성이 용이했다.**

def form_valid(self, form):    print("FirmwareCreateView form_valid override")    self.object = form.save(commit=False)    print("firmware_list request.FILES -", self.request.FILES)    for filename, file in self.request.FILES.items():        print("firmware_list", filename, file, file.name, file.content_type, file.size)        self.object.filename = file.name        if form.cleaned_data["desc"]:        self.object.desc = form.cleaned_data["desc"]        else:        self.object.desc = file.name    self.object = form.save(commit=True)	kind = self.request.GET.get("kind")    print("firmware_list kind", kind)    if not kind:        kind = definitions.FILE_TYPE_FIRMWARE    redirect_url = reverse_lazy("firmware_list") + "?kind=" + kind    print(redirect_url)    return redirect(redirect_url)

코드 참고한 글은 아래 링크이다.

[
Django CreateView: How to perform action upon save
I’m using a custom CreateView (CourseCreate) and UpdateView (CourseUpdate) to save and update a Course. I want to take an action when the Course is saved. I will create a new many-to-many relations…
![](assets/images/2023/02/apple-touch-icon@2.png?ssl=1)
](https://stackoverflow.com/questions/32998300/django-createview-how-to-perform-action-upon-save)

Django – redirect with param 코드조각

말이 필요없다. redirect 하는데 파라메터 있는 경우 처리를 위한 코드 조각을 저장해 둔다.

def redirect_params(url, pk, params=None):    response = redirect(url, pk=pk)    if params:        query_string = urllib.urlencode(params)        response["Location"] += "?" + query_string    return response

url/pk?querystring 모두를 다 처리하는 기본 코드 되겠다.

참고만 하시길, 근데 무식하게 이렇게 해도 되긴 하더라만

redirect_url = reverse_lazy("firmware_list") + "?kind=" + kindprint(redirect_url)return redirect(redirect_url)