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



我正在尝试在页面上以表单显示类。 单击"注册"按钮时,我获取类名称并将其分配给学生模型(该模型具有类模型的外键(。

更新:

新错误:/enregistration/处的值错误 无法分配"'guitar101'":"StudentProfile.student_class"必须是"MusicClass"实例。

  • django 的新手我不知道我在做什么,请帮忙!我的尝试,有什么问题?

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 

views.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')

注册.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:UsersN9587268AppDataLocalProgramsPythonPython36-32libsite-packagesdjangocorehandlersexception.py" in inner
41.             response = get_response(request)
File "C:UsersN9587268AppDataLocalProgramsPythonPython36-32libsite-packagesdjangocorehandlersbase.py" in _get_response
187.                 response = self.process_exception_by_middleware(e, request)
File "C:UsersN9587268AppDataLocalProgramsPythonPython36-32libsite-packagesdjangocorehandlersbase.py" in _get_response
185.                 response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "D:ifb299webrepomusicwebsitewebsiteaccountsviews.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'

现在您正在尝试将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'''

musicClass变量包含MusicClass对象的id,而不是实例本身:

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 }}">

最新更新