2010-02-09 3 views
21

이 모델에이 아닌 몇 가지 추가 필드를 추가했습니다. 양식을 저장할 때 일부 필드에이 필드를 사용합니다.모델에없는 추가 필드가있는 Django ModelForm

추가 필드는 양식에 표시되며 양식을 업로드 할 때 POST 요청으로 전송됩니다. 문제는 양식을 확인할 때 cleaned_data 사전에 추가되지 않는다는 것입니다. 어떻게 액세스 할 수 있습니까?

+0

cleaned_data dictionry에 추가해야합니다. 우리가 볼 수 있도록 양식 코드를 게시하십시오. – gruszczy

+0

양식 필드에 정보를 저장하지 말 것을 권합니다. 더 깨끗한 해결책은 세션에 저장하는 것입니다. – sergzach

+0

후속 답변에 게시 한 코드가 정확하게 복사하여 붙여 넣기를하면 마지막 줄에 들여 쓰기 문제가 발생합니다.이 단어의 한 수준은 –

답변

1

좋아, 해결했습니다. cleaned_data [ 'field_name']로 추가 필드에 액세스하면 KeyError가 발생하지만 cleaned_data.get ('field_name')을 사용하면 효과가있는 것으로 보입니다. 그 모델의 일반 필드는 cleaned_data [ 'field_name']을 통해 액세스 할 수 있기 때문에 이상합니다.

업데이트 : 아니요, 작동하지 않습니다. get()을 사용하면 KeyError가 발생하지 않지만 추가 필드가 cleaned_data 사전에 없으므로 None 값을 설정합니다.

다음은 코드입니다. 템플릿에는 자동 완성이 있으므로 양식에 CharField로 렌더링되는 "아티스트"필드와 지정된 아티스트 ID로 자동 채취되는 숨겨진 IntegerField가 있습니다. clean_artist 메서드에서 아티스트 개체를 선택하고 양식의 아티스트 필드에 저장하려고합니다.

models.py

class Music(models.Model): 
    artist = models.ForeignKey(Artist, related_name='music', blank=True, null=True) 
    # other fields... 

forms.py

class MusicForm(forms.ModelForm): 
    artist_id = forms.IntegerField(label="", widget=forms.HiddenInput(), required=False) 
    artist = forms.CharField(required=False) 
    # other fields ... 

    class Meta: 
     model = Music 

    def clean_artist(self): 
     if self.cleaned_data.get('artist') == '': 
      artist = None 
     else: 
      artist_id = self.cleaned_data.get('artist_id') # this returns always None because artist_id is not in cleaned_fields (this seemed to work with previous django versions but not with current SVN version) 
      if artist_id != None: 
       artist = Artist.objects.get(id=artist_id) 
      else: 
       artist = None 

    return artist 
+0

이어야합니다. get이 아니오이기 때문에 이것은 이상합니다. []와는 다릅니다. 코드를 게시하면 근본적인 문제를 쉽게 찾을 수 있습니다. – gruszczy

+4

반송 예술가는 들여 쓰기가 추가적으로 필요합니다. 그것은 clean_artist 메소드가 아닙니다. –

+1

들여 쓰기가 문제를 해결 했습니까? – Anentropic

5

첫째, 당신은 artist_id 아티스트 필드가 안된다. 그들은 모델을 기반으로합니다. 아티스트 이름이 필요한 경우 artist_name 필드를 추가하십시오 (즉, CharField).

또한 깨끗한 값 내에서 cleaned_data에서 항목을 검색하려고합니다. 필요한 데이터가 없을 수도 있습니다. self.data의 값을 사용해야합니다. 여기서 POST의 데이터는 직접입니다.

+0

실제로 개별 clean_X 메서드 내에서 cleaned_data를 사용하는 것이 맞습니다. http://docs.djangoproject.com/en/dev/ref/forms/validation/#cleaning-a-specific-field-attribute – Anentropic

+0

감사합니다. @Martin – Cartucho

11

Django ModelForm을 추가 필드로 확장 할 수 있습니다. 사용자 정의 사용자 모델이 ModelForm이 상상 : 이제

class ProfileForm(forms.ModelForm): 

    class Meta: 
     model = User 
     fields = ['username', 'country', 'website', 'biography'] 

을, 당신은 추가 필드 포함 할 상상 (당신의 사용자 모델에 존재하지를, 이미지 아바타를 말할 수 있습니다).

from django import forms 

class AvatarProfileForm(ProfileForm): 

    profile_avatar = forms.ImageField() 

    class Meta(ProfileForm.Meta): 
     fields = ProfileForm.Meta.fields + ('profile_avatar',) 

마지막으로 당신의보기에서 폼을 인스턴스화 할 때, request.FILES을 포함해야합니다 (형태가 ImageField을 가지고 주어진) :이 작업을 수행하여 양식을 확장
# (view.py) 

def edit_profile(request): 
    ... 
    form = AvatarProfileForm(
     request.POST or None, 
     request.FILES or None, 
     instance=request.user 
    ) 
    ... 

는 도움이되기를 바랍니다. 행운을 빕니다!

편집 :

내가 AvatarProfileForm.Meta.fields 속성에 오류 "튜플하기 위해"에만 연결할 수 있습니다 튜플 (안 "목록)"를 얻고 있었다. 터플로 바꿨고 효과가있었습니다.

+2

'django.core.exceptions.FieldError : 알 수없는 필드 (my_new_field)가 'my_new_field'를'fields'리스트에 추가 할 때 MyModel에 대해 지정되었습니다. 장고 1.10 – CpILL

4

이 답변은 원래 포스터의 경우 너무 늦을 수 있지만 다른 사람들에게 도움이 될 수 있다고 생각합니다. 나는 똑같은 문제가 있었고 self.cleaned_data ('artist_id')는 clean() 메서드에서는 액세스 할 수 있지만 clean_artist()에서는 액세스 할 수 없다는 것을 알았습니다.

'fields'선언에 추가 필드를 추가하면 작동합니다.

class Meta: 
     model = Music 
     fields=[..., 'artist_id'] 

당신은 clean_artist에 self.cleaned_data ('artist_id')를 액세스 할 수 있어야합니다().

관련 문제