我需要一个允许在计划中创建或添加会话的表单
class Session(models.Model):
tutor = models.ForeignKey(User)
start_time = models.DateTimeField()
end_time = models.DateTimeField()
class SessionForm(forms.ModelForm):
class Meta:
model = Session
exclude = ['tutor']
def editor(request):
if request.method == 'GET':
if request.GET['id'] != '0':
# The user has selected a session
session = Session.objects.get(id=request.GET['id'])
form = SessionForm(instance=session)
else:
# The user wants to add a new session
form = SessionForm()
return render_to_response('planner/editor.html',
{'form': form,}, context_instance=RequestContext(request),)
<form action="/planner/post" method="post">{% csrf_token %}
{{ form.as_p }}
</form>
def post(request):
if request.method == 'POST':
form = SessionForm(request.POST)
if form.is_valid():
form.instance.tutor = request.user
form.save()
obj = {'posted': True}
return HttpResponse(json.dumps(obj), mimetype='application/json')
else:
return render_to_response('planner/editor.html',
form, context_instance=RequestContext(request),)
始终创建会话(永不更新)
post
我怎么知道会话必须更新而不是创建?答案 0 :(得分:17)
如果要更新会话,则需要在绑定表单时提供实例。
如果表单有效,您可以save与commit=False
一起使用,并更新导师。
form = SessionForm(instance=instance, data=request.POST)
if form.is_valid():
instance = form.save(commit=False)
instance.tutor = request.user
instance.save()
答案 1 :(得分:1)
from django.shortcuts import render_to_response, get_object_or_404
from django.http import HttpResponseRedirect, Http404
from django.template import RequestContext
from application.models import Session
from application.forms import SessionForm
def allInOneView(request):
session_id = request.POST.get('session_id')
if session_id:
session = get_object_or_404(Session, pk=session_id)
else:
session = None
"""
A subclass of ModelForm can accept an existing model instance
as the keyword argument instance;
if this is supplied, save() will update that instance.
If it's not supplied, save() will create a new instance of the specified model.
"""
form = SessionForm(instance=session)
if request.method == 'POST':
form = SessionForm(request.POST, instance=session)
if form.is_valid():
form.save()
return HttpResponseRedirect(request.path)
return render_to_response('planner/editor.html', {
'form': form
}, context_instance=RequestContext(request))
答案 2 :(得分:1)
我现在经常做的事情(遵循此处提到的建议)只使用一个视图将可选的session_id(没有创建的session_id)传递给URL调度程序。
<form action="{% url session_edit session_id=session_id|default_if_none:"" %}"
method="post">{% csrf_token %}
{{ form.as_p }}
</form>
url('^planner/edit$', session_edit, name='session_edit'),
url('^planner/edit/(?P<session_id>\d+)$', session_edit, name='session_edit'),
我发现重新组合所有4个案例
进入一个视图更易于维护。
答案 3 :(得分:0)
在一个视图中完成所有操作。类似的东西:
def session_manager(request):
session = None
try:
session = Session.objects.get(id=request.POST['id'])
except Session.DoesNotExist:
pass
if request.method == "POST":
kwargs = {
data = request.POST
}
if session:
# Update
kwargs['instance'] session
form = SessionForm(**kwargs)
if form.is_valid():
...
else:
form = SessionForm(instance=session)