2013-10-15 7 views
1

학생 클래스에 대한 ModelForm을 만들려고합니다. 이것은 현재 로그인 한 사용자를 Django의 인증 시스템과 내 모델 사이의 일대일 관계로 사용합니다. 내 생명을 구하기 위해 이것을 검증 할 수는 없습니다. 여기에 해당 모델은 다음과 같습니다모델 양식이 OneToOneField (사용자)로 유효성을 검사하지 않습니다.

class student(models.Model): 
    user_id = models.OneToOneField(User,unique=True) 
    first_name = models.CharField(max_length=45) 
    last_name = models.CharField(max_length=45) 
    #enrolled_classes = models.ManyToManyField('agility_class') 
    #completed_classes = models.ManyToManyField('agility_class') 
    email_address = models.EmailField() 
    phone_number = PhoneNumberField() 
    training_experience = models.CharField(max_length=500) 
    #training_materials = 



    def __unicode__(self): 
     return self.first_name + " " + self.last_name; 


class studentForm(ModelForm): 
    class Meta: 
     model = student 

내 견해는 다음과 같다 : 어쩌면 나는 과감한 뭔가를 놓친 거지

<form class="form-horizontal" method = 'POST'> 
{%csrf_token%} 
<fieldset> 

<!-- Form Name --> 
<legend>Profile</legend> 

<!-- Text input--> 
<div class="control-group"> 
    <label class="control-label" for="first_name">First Name</label> 
    <div class="controls"> 
    <input id="first_name" name="first_name" type="text" placeholder="" class="input-large"> 

    </div> 
</div> 

<!-- Text input--> 
<div class="control-group"> 
    <label class="control-label" for="last_name">Last Name</label> 
    <div class="controls"> 
    <input id="last_name" name="last_name" type="text" placeholder="" class="input-large"> 

    </div> 
</div> 

<!-- Text input--> 
<div class="control-group"> 
    <label class="control-label" for="email">Email</label> 
    <div class="controls"> 
    <input id="email_address" name="email_address" type="text" placeholder="" class="input-large"> 

    </div> 
</div> 

<!-- Text input--> 
<div class="control-group"> 
    <label class="control-label" for="phone_number">Phone Number</label> 
    <div class="controls"> 
    <input id="phone_number" name="phone_number" type="text" placeholder="" class="input-large"> 
    <p class="help-block">Format: 123-456-7890</p> 
    </div> 
</div> 

<!-- Textarea --> 
<div class="control-group"> 
    <label class="control-label" for="training_experience">Training Experience</label> 
    <div class="controls">      
    <textarea id="training_experience" name="training_experience"></textarea> 
    </div> 
</div> 
<input type="hidden" name= "user_id" value ="{{ user.username }}"> 
<input type="submit" value="submit"> 

</fieldset> 
</form> 

:

여기
def profile_creation(request): 
    if request.method == 'POST': 
     thisform = studentForm(request.POST) 
     if thisform.is_valid(): 
      thisform.save() 
      return HttpResponseRedirect('/about') 

    return render(request, 'profile_registration.html') 

이처럼 내 템플릿 형태가 모습입니다 .... 당신의 도움에 미리 감사드립니다.

+0

'유효성 검사'는 무엇을 의미합니까? 네가 가진 문제는 뭐니? – jproffitt

+0

양식을 제출하면 결코 데이터베이스에 저장되지 않습니다. 나는 내 뷰의 .is_valid() 부분으로 초크 포인트를 좁혔다. –

+0

is_valid() 체크를 통과 했습니까? – jproffitt

답변

2

양식에 이라는 값이 게시되어 있습니다.이 값은 User 개체의 인스턴스가 아닙니다. 이다는 그대로, 먼저 사용자 이름으로 사용자를 검색 할 것이다 당신의 코드가 작동하려면 다음과 같은 속성을 할당합니다

def profile_creation(request): 
    student_form = StudentForm(request.POST or None) 
    if request.method == 'POST': 
     username = request.POST.get('username') 
     try: 
      user = User.objects.get(username=username) 
      student = StudentForm.save(commit=False) 
      student.user = user 
      student.save() 
     except User.DoesNotExist: 
      # handle the exception 
     ... 

을 당신이 있기 때문에, BTW 단순히 user 이름을 것 user_id을 채울 수있다 " user_id "는 user 인스턴스와 함께 오해의 소지가 있습니다. 위 샘플에서 지저분 해지는 뷰에서이를 수행하는 대신 뷰 클래스를 깨끗하게 유지하기 위해 폼 클래스에 해당 값을 할당하는 것이 좋습니다.

# classes ALWAYS start with a capital letter in Python 
class Student(models.Model): 
    user_id = models.OneToOneField(User,unique=True) 
    ... 

class StudentForm(ModelForm): 
    class Meta: 
     model = student 

    def __init__(self, *args, **kwargs): 
     user = kwargs.pop('user') 
     super(StudentForm, self).__init__(*args, **kwargs) 
     self.fields['user'] = user 

# views.py 
from django.core.urlresolvers import reverse 

def profile_creation(request): 
    # Assumes the user is authenticated, otherwise request.user 
    # will be an AnonymousUser instance... 
    student_form = StudentForm(request.POST or None, user=request.user) 
    if request.method == 'POST': 
     if student_form.is_valid(): 
      student_form.save() 
      # don't hard-code urls - use reverse lookups 
      return HttpResponseRedirect(reverse('about')) 

    return render(request, 'profile_registration.html', 
     {'student_form': student_form}) 
+0

멋진 설명에 감사드립니다. 귀하의 2cnd 메서드를 구현할 때 " 'StudentForm'개체에 ''ModelForm이기 때문에 이상한 'save'"특성이 없습니다. 어떤 추측. –

+0

반갑습니다. 왜 ModelForm이'.save()'메소드를 가지지 않을지 확신하지 못합니다. 그것은 저에게 새로운 것입니다. – Brandon

0

예, 사용자 이름으로 사용자 개체를 가져와야합니다.

user = request.POST.get(username=username) 

그리고 당신은 OneToOneField에 사용자 객체를 저장할 수 있습니다.