我制作了这个模型、网址等,但它没有显示我制作的所有问题/pertanyaan。它也没有通过数据库保存答案/jawaban。不知道哪一个有错误。不过,这是我的代码:
views.py
from django.shortcuts import render, redirect
from .models import Pertanyaan
from django.contrib.auth import authenticate, login
from django.contrib.auth.decorators import login_required
from .forms import JawabanForm
from django.contrib import messages
@login_required
def get_jawabans(request):
if request.method == 'POST':
jawab_form = JawabanForm(instance=request.user, data=request.POST)
if jawab_form.is_valid():
jawab_form.save()
messages.success(request, 'Anda berhasil menjawab kuisioner')
else:
messages.error(request, 'Anda gagal menjawab kuisioner')
else:
jawab_form = JawabanForm(instance=request.user)
return render(request, 'survey/kuisioner.html', {'jawab_form':jawab_form})
模型.py
from django.db import models
from django.contrib.auth.models import User
class Kuisioner(models.Model):
judul = models.CharField(max_length=255)
alias = models.SlugField(max_length=255, unique=True)
class Meta:
ordering = ['judul']
def __str__(self):
return self.judul
class Pertanyaan(models.Model):
kuisioner = models.ForeignKey(Kuisioner, related_name='pertanyaans', on_delete=models.CASCADE)
pertanyaan = models.CharField(max_length=255)
created = models.DateTimeField(auto_now_add=True)
class Meta:
ordering = ['-created']
def __str__(self):
return self.pertanyaan
class Jawaban(models.Model):
pertanyaan = models.ForeignKey(Pertanyaan, related_name='jawabans', on_delete=models.CASCADE)
user = models.ForeignKey(User, on_delete=models.CASCADE)
jawab = models.PositiveIntegerField()
调查应用程序内的 urls.py
from django.urls import path, include
from . import views
from django.contrib.auth import views as auth_views
urlpatterns = [
path('kuisioner/', views.get_jawabans, name='get_jawabans')
]
我的项目中的urls.py
urlpatterns = [
path('admin/', admin.site.urls),
path('account/', include('account.urls')),
path('survey/', include('survey.urls')),
]
表格.py
from django import forms
from .models import Jawaban
class JawabanForm(forms.ModelForm):
class Meta:
model = Jawaban
fields = ['pertanyaan', 'jawab']
它正在工作,但它显示如下: 我对这个 django 有点陌生,所以我对 django 的设置很了解
编辑: 这是我的 HTML 文件(我忘了发布它)
kuisioner.html
{% extends "base.html" %}
{% block title %}Dashboard{% endblock %}
{% block content %}
{% for pertanyaan in pertanyaans %}
<form action = "{% url 'get_jawabans' %}"method = "post">
{% csrf_token %}
{{ jawab_form.as_p }}
<input type="submit" value="Submit" />
</form>
{% endfor %}
{% endblock %}
在函数的 POST 方法中。您应该使用重定向方法,这样表单就不会发布两次并移动到另一个页面或同一页面。
通过查看您的代码,应该保存数据(您应该检查管理页面以获取保存的数据)。但是,您没有重定向到任何页面,因此它保留在同一页面上。
更新代码如下:
from django.http import HttpResponseRedirect
@login_required
def get_jawabans(request):
if request.method == 'POST':
jawab_form = JawabanForm(instance=request.user, data=request.POST)
if jawab_form.is_valid():
jawab_form.save()
messages.success(request, 'Anda berhasil menjawab kuisioner')
return HttpResponseRedirect('success/')
else:
messages.error(request, 'Anda gagal menjawab kuisioner')
else:
jawab_form = JawabanForm(instance=request.user)
return render(request, 'survey/kuisioner.html', {'jawab_form':jawab_form})
在应用程序 urls.py 文件中为
success/
URL 创建一个条目,用于上述重定向。