2011-03-30 6 views
1

로그인하려는 사용자, save_model() 및 save_formset()에 대한 몇 가지 사항은 Django의 modelAdmin에서 질문합니다.Django User Foreignkey, save_model 및 save_formset

사용자가 http POST를 통해 업로드하는 사진을 찍는 모델이 있다고 가정 해 보겠습니다. models.py에서

:

class photo(models.Model): 
    title = models.CharField(max_length=50) 
    img = models.ImageField(upload_to='photocollection') 
    uploader = models.ForeignKey(User) 
    latitude = models.FloatField(null=True, blank=True) 
    longitude = models.FloatField(null=True, blank=True) 

    def save(self): 
     #Retain the model instance to do some processing before saving: 
     self.latitude = exif.getGPSLatitude(self.img) 
     self.longitude = exif.GPSLongitude(self.img) 
     return super(photoCollection, self).save() 

class photoForm(ModelForm): 
    class Meta: 
     model = photo 

그런 다음 내 views.py에 : 여기

def upload(request): 
    form = photoForm(request.POST, request.FILES) 

    if form_is_valid(): 
     #do something useful 
     form.save() 

나는 흥미로운 시나리오가 있습니다. 모델의 [업 로더] 필드가 업데이트되지 않으므로 내 views.py의 양식이 유효하지 않으며 필수 입력란이므로 저장하지 않습니다.

1) 유효성을 검사하려면 양식을 어떻게받을 수 있습니까?

또한 양식을 저장할 때 modelAdmin에서 save_model()을 사용하여 ForeignKey (User)를 저장하는 방법을 가르치는 게시물 here을 보았습니다. 내 admin.py에 photoAdmin 클래스를 생성하여, 링크와 같이 나는이 overiding 시도했다 :

class photoAdmin(admin.ModelAdmin): 
    def save_model(self, request, obj, form, change): 
     if not change: 
      obj.uploader = request.user 
     obj.save() 

하지만 여전히 request.user 또는 request.user.username와 업 로더 필드를 저장할 수 없습니다 수 . 내 views.py에서 photoForm을 사용하고 있기 때문에 save_formset()도 역시 무시하려고 시도했습니다. 아직 아무 소용이 없습니다.

2) save_model() 및 save_formset()이 실제로 호출되는 시점은 언제입니까?

3) save_formset()과 save_model()의 차이점은 무엇입니까?

4) 위의 views.py에서 form.save()를 호출 할 때 save_model() 또는 save_formset()이 호출됩니까?

5) views.py에서 양식의 유효성을 검사하고 uploader 필드를 request.user로 저장하는 방법에있어 잘못된 점이 무엇이며 어떻게 수정해야합니까? 일부 샘플 코드는 큰 도움이 될 것입니다.

나는 장고 문서를 Admin site에 읽었지만 정확하게 질문에 답하지 않습니다. 어떤 깨달음이라도 대단히 감사하겠습니다.

답변

7

보기에 대한 첫 번째 질문을 처리해 보겠습니다. 말하듯이 업 로더가 제공되지 않아 유효한 양식이 아닙니다. 사용자 입력란 ModelForm에서 exclude 메타 클래스 속성을 사용하여 사용자 입력란을 제외시킵니다 (자동 삽입 할 예정이므로). ModelAdmin에 대한

class photoForm(ModelForm): 
    class Meta: 
     model = photo 
     exclude= ('uploader',) 

if form_is_valid(): # uploader has been excluded. No more error. 
    photo = form.save(commit=False) # returns unsaved instance 
    photo.uploader = request.user 
    photo.save() # real save to DB. 

두 번째 질문 :

아니, save_model()은 당신의 views.pyform 함께 할 수 없다하는 ModelAdmin 방법이다. 편집중인 객체의 ModelForm이 유효성이 확인되면 save_modelModelAdmin에서 호출됩니다.

양식에 오류가없는 경우 ModelAdmin에 대한 코드가 있어야합니다. 당신이 더 많은 조언을 원한다면 어떤 오류가 있는지 말해야 할 것입니다!


2) save_model()와 save_formset을 수행 할 때() 실제로 호출되는?

양식과 양식 세트가 모두 검증됩니다.

3) save_formset()과 save_model()의 차이점은 무엇입니까? 모델, 즉 편집 중 어떤 모델이 (save_model 윌 formsets

4 (ModelAdmin.inlines)

)를 저장) 또는 save_formset에 대한

save_formset입니다으로 ModelAdmin 등록을 위해

save_model

은() 위의 views.py에서 form.save()를 호출하기 만하면 이 발생합니까?

아니요, 왜 그럴까요? 그것들은 당신의 views.py 양식과 완전히 관련이 없습니다. save_model()은 메서드이며 Form 메서드는 아닙니다.

5) 무엇 views.py 에서 폼을 검증뿐만 아니라 request.user와 업 로더 필드 을 저장 모두 내 접근 방식에 문제가 있습니다, 그리고 어떻게 그것을 해결 해야합니까? 일부 샘플 코드는 큰 도움이 것입니다.

귀하 께서 말씀 드린대로, 업 로더가 필요하므로 유효성 검사가 실패합니다. 업 로더 필드를 설정하려는 경우 위의 코드 예제를 사용하여 유효성 검사 오류를 방지하십시오.

희망 하시겠습니까?

+0

감사합니다. 그것은 트릭을했다. 별난 질문에 대해 유감스럽게 생각합니다.하지만 ModelAdmin의 save_models에 대한 오해가있었습니다. 나는이 모델이 views.py에서 생성 된 모델과 관련이 있고, 모델이 생성 될 때마다 소중히 여길 것이라고 생각했습니다. 나는 아직도 어떤 상황에서 AdminModel 클래스를 어디에 호출 할 것인가에 대해서는 아직까지 확신 할 수 없다. 장고의 관리자 사이트 (/ admin /)와 관련된 일을 할 때만 사용됩니까? – evkwan

+0

'ModelAdmin'은 관리 사이트 전용입니다. django.contrib.admin 만 모델 admin을 호출합니다. –

+0

오, 그래! 당신의 본보기는 2 시간의 손놀림 후에 트릭을했습니다! 너 다행이야. –

관련 문제