문제

나는 여기서 완전히 예약 할 수 있습니다. (내가 있는지 말해주십시오.)

제 사용 사례는 학교 목록이 있다는 것입니다. 학교 모델은 매우 간단합니다.

class School(models.Model):
    name = models.CharField(max_length=100)
    mascot = models.CharField(max_length=100, null=True, blank=True)

사용자 가이 학교 중 하나를 편집하려면 마스터 사본을 편집하는 것을 원하지 않습니다. 대신, 나는 그들에게 그들이 할 수있는 자신의 사본을주고 싶습니다. 그들이 사본을 편집 할 때, 그들은 사본을 제출할 수 있으며 다른 사람이 그것을 승인 할 것입니다. 그래서 나는 사용자의 학교 사본을위한 또 다른 수업이 있습니다.

class UserSchool(models.Model):
    name = models.CharField(max_length=100)
    mascot = models.CharField(max_length=100, null=True, blank=True)
    master_school = models.ForeignKey(School)
    user = models.ForeignKey(settings.AUTH_USER_MODEL)

그래서 사용자 학교의 편집을 처리하기위한 양식을 설정했습니다.

class UserSchoolForm(forms.ModelForm):
    class Meta:
        model = UserSchool
        fields = ['name','mascot']

그리고 이제 나는 내 editschool 양식을 가지고 있습니다.

class EditSchool(UpdateView):
    model = School
    success_url = reverse_lazy('list_schools')
    form_class = UserSchoolForm

    def get(self, request, *args, **kwargs):
        school = self.get_object()

        # make a copy of the school for this user
        user_school, created = UserSchool.objects.get_or_create(
            master_school=school, user=request.user,
            defaults={'name' : school.name, 'mascot' : school.mascot})

        self.object = user_school
        form = UserSchoolForm()
        context = self.get_context_data(form=form)
        return self.render_to_response(context)

get ()가 사본을 올바르게 만들고 있지만 양식이 표시되면 "이름"또는 "기본값"필드에 나열된 값이 없습니다. 내 의심은 문제는 cls.model = school이지만 self.object는 사용자 학교의 인스턴스라는 사실에 관한 것입니다.

내가 가까이 있지만 뭔가를 놓치고 있습니까? 내가 완전히 잘못된 길을 가고 있습니까? 이것에 대한 더 나은 모델이 있습니까 ( "마스터"를위한 특별한 사용자가있는 단일 학교 인스턴스를 갖는 것과 같이)?

(그리고 한 가지 작은 합병증-나는 Django의 오래된 손이지만 새로운 수업 기반보기이기 때문에, 나는 무슨 일이 일어나고 있는지 알아 내기가 더 쉽기 때문에 바닐라보기를 사용하려고 노력하고 있습니다.)

도움이 되었습니까?

해결책

명백한 것을 배제하기 위해 - 당신은 양식 생성자에게 아무것도 전달하지 않습니다. 당신은 그것을 시도 했습니까? instance=user_school? 더 많은 작업이 필요할 수도 있지만 거기서 시작할 것입니다.

이것을 조금 확장하려면 - 당신의 관점에서, 당신은 내장을 완전히 무시하고 있습니다. get 방법. 괜찮지 만 View Superclass의 자동화 된 동작을 우회한다는 것을 의미합니다. 구체적으로, get 의 방법 ProcessFormView (조상 수업 중 하나)는 get_form 보기 클래스의 방법. FormMixin, 또 다른 조상은 정의합니다 get_form:

return form_class(**self.get_form_kwargs())

그리고 get_form_kwargs ~에 ModelFormMixin 추가합니다 self.object 양식에 kwargs:

kwargs.update({'instance': self.object})

당신이 우선했기 때문입니다 get 메소드는 호출하지 않습니다 get_form, 그것은 또한 전화하지 않습니다 get_form_kwargs 따라서 양식에 대한 초기 바인딩을 제공하는 전체 경로를 통과하지 않습니다.

나는 개인적으로 get_object 사용자 정의보기 방법과 나머지를 내버려 두는 방법 :

class EditSchool(UpdateView):
    model = School
    success_url = reverse_lazy('list_schools')
    form_class = UserSchoolForm

    def get_object(self, queryset=None):
        school = super(EditSchool, self).get_object(queryset=queryset)
        user_school, created = UserSchool.objects.get_or_create(
            master_school=school, user=self.request.user,
            defaults={'name' : school.name, 'mascot' : school.mascot})
        return user_school

더 많은 변화가 필요할 수 있습니다 - 나는 이것을 테스트하지 않았지만 둘 다 get 그리고 set 방법 사용 get_object, 적절한 양식에 바인딩하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top