2017-11-10 9 views
0

CreateView 양식을 표시 할 때 로그인 한 사용자의 데이터를 사용하여 foreignKey 값을 채우고 싶습니다. 나는 이것을 읽기 전용으로 원한다.읽기 전용 foreignKey 값을 가진 Django CreateView 폼을 채우십시오

내 모델은 다음과 같습니다

# User profile info 
class Profile(models.Model): 

    # Relationship Fields 
    user = models.OneToOneField(User, on_delete=models.CASCADE) 
    school = models.ForeignKey('eduly.School', default=1) 

    notes = models.TextField(max_length=500, blank=True) 


@receiver(post_save, sender=User) 
def create_user_profile(sender, instance, created, **kwargs): 
    if created: 
     Profile.objects.create(user=instance) 


@receiver(post_save, sender=User) 
def save_user_profile(sender, instance, **kwargs): 
    instance.profile.save() 


class School(models.Model): 

    # Fields 
    name = models.CharField(max_length=255) 
    address = models.TextField(max_length=500, blank=True) 
    email = models.CharField(max_length=30) 
    phone = models.CharField(max_length=15) 
    contactName = models.CharField(max_length=30) 
    slug = extension_fields.AutoSlugField(populate_from='name', blank=True) 
    created = models.DateTimeField(auto_now_add=True, editable=False) 
    last_updated = models.DateTimeField(auto_now=True, editable=False) 


    class Meta: 
     ordering = ('-created',) 

    def __unicode__(self): 
     return u'%s' % self.slug 

    def __str__(self): 
     return self.name 

    def get_absolute_url(self): 
     return reverse('eduly_school_detail', args=(self.slug,)) 


    def get_update_url(self): 
     return reverse('eduly_school_update', args=(self.slug,)) 


class Teacher(models.Model): 

    SCHOOL_ADMIN = 0 
    CLASS_ADMIN = 1 
    TASK_ADMIN = 2 

    ROLES = { 
     (SCHOOL_ADMIN, "School administrator"), 
     (CLASS_ADMIN, "Class administrator"), 
     (TASK_ADMIN, "Task administrator") 
    } 

    # Fields 
    name = models.CharField(max_length=255) 
    slug = extension_fields.AutoSlugField(populate_from='name', blank=True) 
    created = models.DateTimeField(auto_now_add=True, editable=False) 
    last_updated = models.DateTimeField(auto_now=True, editable=False) 
    email = models.CharField(max_length=30) 
    roles = models.IntegerField("Role", choices=ROLES, default=1) 

    # Relationship Fields 
    school = models.ForeignKey('eduly.School',) 

    class Meta: 
     ordering = ('-created',) 

    def __str__(self): 
     return self.name 

    def __unicode__(self): 
     return u'%s' % self.slug 

    def get_absolute_url(self): 
     return reverse('eduly_teacher_detail', args=(self.slug,)) 


    def get_update_url(self): 
     return reverse('eduly_teacher_update', args=(self.slug,)) 

내 의견은 : 내가 읽기 전용 필드 self.request.user.profile.school에 Teacher.school 외래 키 필드를 설정할 TeacherCreateView를 들어

@method_decorator(login_required, name='dispatch') 
class TeacherListView(ListView): 
    model = Teacher 

    def get_queryset(self): 
     return Teacher.objects.filter(school=self.request.user.profile.school) 


@method_decorator(login_required, name='dispatch') 
class TeacherCreateView(CreateView): 
    model = Teacher 
    form_class = TeacherForm 

.

+0

이렇게하면 도움이 될 것입니다 https://stackoverflow.com/questions/32273135/how-to-override-form-field-in-createview – itzMEonTV

+0

어떻게 대답이 foreignKey 필드 설정과 관련되어 있는지 잘 모르겠습니다. 읽기 전용으로 만듭니 까? –

+0

왜 읽기 전용으로 만들고 싶습니까? 사용자가 수정할 수 없으면 왜 표시하지 않는 것입니까? 보기로 설정하기 만하면됩니다 (예 : https://docs.djangoproject.com/en/1.11/topics/class-based-views/generic-editing/#models-and-request-user). 그 일을하는 방법에 대해서. –

답변

0

양식에 다음과 같이 할 수 있습니다. 마법은 필드 속성이 disabled입니다.

class TeacherForm(forms.modelForm): 
    def __init__(self, *args, **kwargs): 
     super(TeacherForm, self).__init__(*args, **kwargs) 
     self.fields['school'].disabled = True 

    class Meta: 
     fileds = '__all__' 

django 문서를 읽을 수 있습니다. 참조 : https://docs.djangoproject.com/en/1.11/ref/forms/fields/#disabled