在 Django 中创建视图的行为
Behaviour of Create Views in Django
我几乎是 Django 的新手。因为我现在想提高我的游戏水平,所以我想深入研究 基于通用 class 的视图。我已经知道如何使用模板视图,但现在我想去创建视图。
我有这些表格:
class LearningObjectiveForm(ModelForm):
class Meta:
exclude = ['trainee']
这些模型:
class LearningObjective(models.Model):
trainee = models.ForeignKey(Trainee, blank = True)
learning_objective = models.TextField()
class Trainee(models.Model):
username = models.TextField()
...
class Topic(models.Model):
trainee = models.ForeignKey(Trainee, blank = True)
learning_objective = models.ManyToManyField(LearningObjective, blank = True, null = True)
topic = models.TextField()
创建视图:
class CreateLearningObjective(CreateView):
model = LearningObjective
form = LearningObjectiveForm
def form_valid(self, form):
self.object = form.save(commit=False)
if self.request.user.is_authenticated():
self.object.trainee = self.request.user
self.object.save()
return super(CreateLearningObjective, self).form_valid(form)
我的网址:
from django.conf.urls import patterns, url
from programm import views
from .views import LearningObjectiveView, CreateLearningObjective
urlpatterns = patterns('',
url(r'^$', views.index, name='index'),
url(r'^learning_objective/$', LearningObjectiveView.as_view(), name = 'learning_objective'),
url(r'^learning_objective_add/$', CreateLearningObjective.as_view(), name = 'learning_objective_add'),
)
模板:
<form action="{% url 'learning_objective_add' %}" method="post">
{% csrf_token %}
<textarea name="learning_objective" rows="4"></textarea>
<p><select name="topic" size="6" multiple>
{% for lO in learning_objectives %}
{% for t in lO.topic_set.all %}
<option>{{ t.topic }}</option>
{% endfor %}
{% endfor %}
</select></p>
<input type="submit" value="Absenden"/>
</form>
不幸的是,当我尝试提交 post 时,我收到了 Cannot assign None: "LearningObjective.trainee" does not allow null values.
错误。有人可以帮帮我吗??我真的很困惑,不知道我应该在这里做什么:/
将您的 urls.py 更改为:
urlpatterns = patterns('',
url(r'^$', views.index, name='index'),
url(r'^learning_objective/$', LearningObjectiveView.as_view(), name = 'learning_objective'),
url(r'^learning_objective_add/$', CreateLearningObjective.as_view(), name = 'learning_objective_add'),
)
错误是你的第二个url('^learning_objective')拦截了对第三个url的post请求。这就是为什么你应该在正则表达式的末尾添加 $
。
由于 APPEND_SLASH
设置,POST
视图也需要 /
斜杠。
我几乎是 Django 的新手。因为我现在想提高我的游戏水平,所以我想深入研究 基于通用 class 的视图。我已经知道如何使用模板视图,但现在我想去创建视图。
我有这些表格:
class LearningObjectiveForm(ModelForm):
class Meta:
exclude = ['trainee']
这些模型:
class LearningObjective(models.Model):
trainee = models.ForeignKey(Trainee, blank = True)
learning_objective = models.TextField()
class Trainee(models.Model):
username = models.TextField()
...
class Topic(models.Model):
trainee = models.ForeignKey(Trainee, blank = True)
learning_objective = models.ManyToManyField(LearningObjective, blank = True, null = True)
topic = models.TextField()
创建视图:
class CreateLearningObjective(CreateView):
model = LearningObjective
form = LearningObjectiveForm
def form_valid(self, form):
self.object = form.save(commit=False)
if self.request.user.is_authenticated():
self.object.trainee = self.request.user
self.object.save()
return super(CreateLearningObjective, self).form_valid(form)
我的网址:
from django.conf.urls import patterns, url
from programm import views
from .views import LearningObjectiveView, CreateLearningObjective
urlpatterns = patterns('',
url(r'^$', views.index, name='index'),
url(r'^learning_objective/$', LearningObjectiveView.as_view(), name = 'learning_objective'),
url(r'^learning_objective_add/$', CreateLearningObjective.as_view(), name = 'learning_objective_add'),
)
模板:
<form action="{% url 'learning_objective_add' %}" method="post">
{% csrf_token %}
<textarea name="learning_objective" rows="4"></textarea>
<p><select name="topic" size="6" multiple>
{% for lO in learning_objectives %}
{% for t in lO.topic_set.all %}
<option>{{ t.topic }}</option>
{% endfor %}
{% endfor %}
</select></p>
<input type="submit" value="Absenden"/>
</form>
不幸的是,当我尝试提交 post 时,我收到了 Cannot assign None: "LearningObjective.trainee" does not allow null values.
错误。有人可以帮帮我吗??我真的很困惑,不知道我应该在这里做什么:/
将您的 urls.py 更改为:
urlpatterns = patterns('',
url(r'^$', views.index, name='index'),
url(r'^learning_objective/$', LearningObjectiveView.as_view(), name = 'learning_objective'),
url(r'^learning_objective_add/$', CreateLearningObjective.as_view(), name = 'learning_objective_add'),
)
错误是你的第二个url('^learning_objective')拦截了对第三个url的post请求。这就是为什么你应该在正则表达式的末尾添加 $
。
由于 APPEND_SLASH
设置,POST
视图也需要 /
斜杠。