이 모델에이 아닌 몇 가지 추가 필드를 추가했습니다. 양식을 저장할 때 일부 필드에이 필드를 사용합니다.모델에없는 추가 필드가있는 Django ModelForm
추가 필드는 양식에 표시되며 양식을 업로드 할 때 POST 요청으로 전송됩니다. 문제는 양식을 확인할 때 cleaned_data
사전에 추가되지 않는다는 것입니다. 어떻게 액세스 할 수 있습니까?
이 모델에이 아닌 몇 가지 추가 필드를 추가했습니다. 양식을 저장할 때 일부 필드에이 필드를 사용합니다.모델에없는 추가 필드가있는 Django ModelForm
추가 필드는 양식에 표시되며 양식을 업로드 할 때 POST 요청으로 전송됩니다. 문제는 양식을 확인할 때 cleaned_data
사전에 추가되지 않는다는 것입니다. 어떻게 액세스 할 수 있습니까?
좋아, 해결했습니다. 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
이어야합니다. get이 아니오이기 때문에 이것은 이상합니다. []와는 다릅니다. 코드를 게시하면 근본적인 문제를 쉽게 찾을 수 있습니다. – gruszczy
반송 예술가는 들여 쓰기가 추가적으로 필요합니다. 그것은 clean_artist 메소드가 아닙니다. –
들여 쓰기가 문제를 해결 했습니까? – Anentropic
첫째, 당신은 artist_id 아티스트 필드가 안된다. 그들은 모델을 기반으로합니다. 아티스트 이름이 필요한 경우 artist_name 필드를 추가하십시오 (즉, CharField).
또한 깨끗한 값 내에서 cleaned_data에서 항목을 검색하려고합니다. 필요한 데이터가 없을 수도 있습니다. self.data의 값을 사용해야합니다. 여기서 POST의 데이터는 직접입니다.
실제로 개별 clean_X 메서드 내에서 cleaned_data를 사용하는 것이 맞습니다. http://docs.djangoproject.com/en/dev/ref/forms/validation/#cleaning-a-specific-field-attribute – Anentropic
감사합니다. @Martin – Cartucho
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 속성에 오류 "튜플하기 위해"에만 연결할 수 있습니다 튜플 (안 "목록)"를 얻고 있었다. 터플로 바꿨고 효과가있었습니다.
'django.core.exceptions.FieldError : 알 수없는 필드 (my_new_field)가 'my_new_field'를'fields'리스트에 추가 할 때 MyModel에 대해 지정되었습니다. 장고 1.10 – CpILL
이 답변은 원래 포스터의 경우 너무 늦을 수 있지만 다른 사람들에게 도움이 될 수 있다고 생각합니다. 나는 똑같은 문제가 있었고 self.cleaned_data ('artist_id')는 clean() 메서드에서는 액세스 할 수 있지만 clean_artist()에서는 액세스 할 수 없다는 것을 알았습니다.
'fields'선언에 추가 필드를 추가하면 작동합니다.
class Meta:
model = Music
fields=[..., 'artist_id']
당신은 clean_artist에 self.cleaned_data ('artist_id')를 액세스 할 수 있어야합니다().
cleaned_data dictionry에 추가해야합니다. 우리가 볼 수 있도록 양식 코드를 게시하십시오. – gruszczy
양식 필드에 정보를 저장하지 말 것을 권합니다. 더 깨끗한 해결책은 세션에 저장하는 것입니다. – sergzach
후속 답변에 게시 한 코드가 정확하게 복사하여 붙여 넣기를하면 마지막 줄에 들여 쓰기 문제가 발생합니다.이 단어의 한 수준은 –