我正在使用django == 2.1建立一个事件注册网站。我已经创建了视图,以便管理员可以创建事件,而学生可以查看这些创建的事件并单击按钮以参与其中。我有已登录学生的所有详细信息。如果学生单击“参与”按钮,我希望他的名册和事件名称(在他的详细信息页面中,他单击了按钮)保存在以下给出的EventParticipants
模型中:
class EventParticipants(models.Model):
event_name = models.ForeignKey(Event, on_delete=models.CASCADE)
participant_roll = models.ForeignKey(
Student, on_delete=models.CASCADE, to_field='roll')
def get_absolute_url(self):
return reverse('dashboard')
我目前的实现方式是将学生带到另一个页面,在该页面上,他必须单击另一个按钮来确认他的注册并提交表格。如何在不重定向用户的情况下将数据存储在模型中?
答案 0 :(得分:0)
在这种情况下,您可以使用jQuery
和AJAX
。我建议如下:
创建用于注册/参与的网址,该网址将通过AJAX请求示例进行调用:
urlpatterns [
...
path('participate-in-event/<int:event_id>/', Participate.as_view(), name='participate'),
...
]
from django.views import View
class Participate(View):
def get(self, request, event_id)
event = Event.objects.get(id=event_id)
if request.is_ajax():
try:
enrollment = EventParticipants.objects.create(event_name=event, participant_roll=request.user.student)
return JsonResponse({'enrolled': 1, 'message': 'Successfully enrolled', 'event':event.name}, status=200)
except Exception as ex:
return JsonResponse({'enrolled': 0, 'messsage': str(ex), 'event': event.name}, status=403)
在列出事件的模板中,您可以像下面的示例一样列出它们(但不仅限于此,它只是另一种方式,您可以根据需要进行修改。
{% for event in events %}
<h1>{{ event.name }}</h1>
<a class='participate-link' href='javascript:void(0)' data-url="{{ url 'participate' event.id }}"> Participate in this event</a>
{% endfor %}
...
<!-- include jquery here -->
<script type='text/javascript'>
$(function(){
$('.participate-link').bind('click', function(){
$.ajax({
url: $(this).attr('data-url'),
type: 'get',
dataType: 'json'
data: {},
success: function(response){
alert(repsonse.message + 'Event: ' + response.event);
},
fail: function(data){alert(data.message)}
});
});
});
注意::在
Participate()
视图中,我假设学生模型与默认的django User对象具有一对一的关系