首页 > 解决方案 > 如何通过单击按钮在后台提交 Django 表单?

问题描述

我正在使用 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')

我当前的实现将学生带到另一个页面,他必须单击另一个按钮来确认他的注册并提交表格。如何在不重定向用户的情况下将数据存储在模型中?

标签: djangodjango-modelsdjango-forms

解决方案


在这种情况下,您可以使用jQueryand 。AJAX我建议如下:

网址.py

创建一个用于注册/参与的 url,它将通过 AJAX 请求示例调用:

urlpatterns  [
...
    path('participate-in-event/<int:event_id>/', Participate.as_view(), name='participate'),
...
]

视图.py

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)

html

在列出事件的模板中,您可以像以下示例一样列出它们(但您不仅限于此,它只是另一种方式,您可以根据需要进行修改。

{% 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 对象具有一对一的关系


推荐阅读