Пытаетесь сохранить данные POST NAME CLASS в модели STUDENT (внешний ключ)? - PullRequest
0 голосов
/ 24 мая 2018

Я пытаюсь отобразить классы в форме на странице.когда нажата кнопка регистрации, я получаю имя класса и назначаю его модели студента (которая имеет внешний ключ к модели класса) ..

Обновление:

НОВАЯ ОШИБКА: ValueError at / enroll / Невозможно назначить "'guitar101'": «StudentProfile.student_class» должен быть экземпляром «MusicClass».

  • Впервые в django IПонятия не имею, что я делаю, пожалуйста, помогите! Моя попытка, в чем проблема?

models.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)

forms.py

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

enrol.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

Запрос информации POST (Пример - это то, что я получаю из сообщения при нажатии на кнопку регистрации)BTN)

csrfmiddlewaretoken 
'TY28RiLjhtu98v8uthXFuCGJ4pPO3z6e02IDa6x8UFujenzEZdECunhxuqcAKtCw'
musicClass  
'guitar101'
enrolBtn    
'Enrol'

Ответы [ 2 ]

0 голосов
/ 24 мая 2018

Теперь вы пытаетесь присвоить string полю 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'''
0 голосов
/ 24 мая 2018

Переменная musicClass содержит id объекта 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 }}">
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...