代码之家  ›  专栏  ›  技术社区  ›  billy

尝试在学生模型中保存Post数据类名(外键)?

  •  0
  • billy  · 技术社区  · 7 年前

    我正试图以页面上的形式显示类。当单击Enrol按钮时,我得到类名并将其分配给学生模型(该模型有一个外键)。

    更新:

    新错误:valueerror at/enrol/ 无法分配“'guitar101”:“studentprofile.student”类必须是“musicClass”实例。

    • 刚来Django我不知道我在做什么,请帮忙! 我的尝试,有什么问题?

    型号.py

    class StudentProfile(models.Model):
        user = models.OneToOneField('Accounts', related_name='student_profile')
        student_class = models.ForeignKey(to=MusicClass, related_name="student_class", null=True, blank=True)
        is_student = models.BooleanField('student status', default=True)
         # more fields
    
    
    class MusicClass(models.Model):
        class_name = models.CharField(max_length=500, blank=True)
        # more fields 
    

    视图.py

    # enrolls student
    def studentEnrol(request):
    
        if request.method == "POST":
           musicClass     = request.POST.get('musicClass', '')
           student_profile  = StudentProfile(student_class=musicClass)
           student_profile.save()
           return HttpResponseRedirect('/') 
    
    
        else:    
            querySet = MusicClass.objects.all()
            args = {'classes': querySet }
    
        return render(request, 'accounts/enrol.html', args)
    

    表格.py

    class MusicClassesEnrolForm(forms.ModelForm):
        class Meta:
            model = MusicClass
            fields = ('class_name', 'class_level', 'class_time', 'class_room', 'instrument_taught', 'day', 'teacher')
    

    安然.html

     {% extends 'base.html' %}
    
     {% block body %}
     <div class="outer"><div class="container">
         <h1> Enrol into Class </h1>
    
        <table style="width:100%">
          <tr>
            <th>Class Name</th>
            <th>Instrument</th> 
            <th>Class Level</th>
            <th>Time</th>
            <th>Teacher</th>
            <th>Room</th>
            <th>Register</th>
          </tr><br>
            {% for class in classes %}
    
              <tr>
                <td>{{ class.class_name }}</td>
                <td>{{ class.instrument_taught }}</td>
                <td>{{ class.class_level }}</td>
                <td>{{ class.class_time }}</td>
                <td>{{ class.teacher }}</td>
                <td>{{ class.class_room }}</td>
                <td><form method="post">
                    {% csrf_token %}
                    <input type="hidden" name="musicClass" value="{{ class.class_name }}">
                    <input type="submit" name="enrolBtn" value="Enrol">
                </form></td>
              </tr>
    
            {% endfor %}
         <table>
    
    
        </p>
    
    </div>
    </div>
    {% include "footer.html" %}
    {% endblock %}
    

    有什么想法吗?

    更新-添加了跟踪

    Environment:
    
    
    Request Method: POST
    Request URL: http://127.0.0.1:8000/enrol/
    
    Django Version: 1.11.7
    Python Version: 3.6.5
    Installed Applications:
    ['accounts',
     'timetable',
     'django.contrib.admin',
     'django.contrib.auth',
     'django.contrib.contenttypes',
     'django.contrib.sessions',
     'django.contrib.messages',
     'django.contrib.staticfiles']
    Installed Middleware:
    ['django.middleware.security.SecurityMiddleware',
     'django.contrib.sessions.middleware.SessionMiddleware',
     'django.middleware.common.CommonMiddleware',
     'django.middleware.csrf.CsrfViewMiddleware',
     'django.contrib.auth.middleware.AuthenticationMiddleware',
     'django.contrib.messages.middleware.MessageMiddleware',
     'django.middleware.clickjacking.XFrameOptionsMiddleware']
    
    
    
    Traceback:
    
    File "C:\Users\N9587268\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\core\handlers\exception.py" in inner
      41.             response = get_response(request)
    
    File "C:\Users\N9587268\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\core\handlers\base.py" in _get_response
      187.                 response = self.process_exception_by_middleware(e, request)
    
    File "C:\Users\N9587268\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\core\handlers\base.py" in _get_response
      185.                 response = wrapped_callback(request, *callback_args, **callback_kwargs)
    
    File "D:\ifb299\webrepo\musicwebsite\website\accounts\views.py" in studentEnrol
      127.        StudentProfile = StudentProfile(student_class=musicClass)
    
    Exception Type: UnboundLocalError at /enrol/
    Exception Value: local variable 'StudentProfile' referenced before assignment
    

    请求信息发布(示例这是我在点击Enrol BTN时从发布中获得的信息)

    csrfmiddlewaretoken 
    'TY28RiLjhtu98v8uthXFuCGJ4pPO3z6e02IDa6x8UFujenzEZdECunhxuqcAKtCw'
    musicClass  
    'guitar101'
    enrolBtn    
    'Enrol'
    
    2 回复  |  直到 7 年前
        1
  •  2
  •   Lemayzeur    7 年前

    现在您正在尝试分配 string 到A ForeignKey 字段不正确。 在得到 musicClass = request.POST.get('musicClass', '') ,您应该拥有或创建一个 MusicClass 有它的实例

    我用 get_or_create

    # @login_required # A login decorator is very important here
    def studentEnrol(request):
        user = request.user
        if not hasattr(user,'student_profile'): 
             # The current user doesn't have student_profile attribute
             # redirect to the page you want
             return redirect('completeProfile') # for instance
        student_profile = request.user.student_profile
        if request.method == "POST":
             id_musicClass     = request.POST.get('musicClass')
             music_class = MusicClass.objects.get(id=id_musicClass)
             # or music_class = get_object_or_404(MusicClass,id=id_musicClass)
             student_profile.student_class = music_class
             student_profile.save()
             return HttpResponseRedirect('/') 
        else:
            '''rest of the codes'''
    
        2
  •  0
  •   Selcuk    7 年前

    这个 musicClass 变量包含 身份证件 A的 MusicClass 对象而不是实例本身:

    musicClass     = request.POST.get('musicClass', '')
    student_profile  = StudentProfile(student_class=musicClass)
    

    为了分配给 student_class 需要实例的字段。试试这个:

    music_class_id = int(request.POST.get('musicClass'))
    music_class = MusicClass.objects.get(pk=music_class_id)
    student_profile  = StudentProfile(student_class=music_class)
    

    并更改以下行

    <input type="hidden" name="musicClass" value="{{ class.class_name }}">
    

    <input type="hidden" name="musicClass" value="{{ class.id }}">