有没有办法在表单提交之前将Javascript变量传递给Django模板?

问题描述 投票:0回答:1

我正在尝试在 Django 中提交表单之前获得选定的批准者并进行验证检查...事实证明这相当复杂...我已经完成了大部分工作...但是不能似乎弄清楚如何“获取”在 Django 模板中翻译的 ID...我已经获得了 ID...但似乎无法建立最终的连接...

这是我的 AJAX...

 $("#avail").on("click", function(event) {
   var modalavail = document.getElementById("myModalavail");
   var markedCheckbox = document.querySelectorAll('input[type="checkbox"]:checked');
   event.preventDefault();
   $(window).unbind('beforeunload');
   $.ajax({
       method: 'get',
       headers: { "X-CSRFToken": token },
       url: "",
       processData: false,
       contentType: false,
       cache: false,
       enctype: 'multipart/form-data',
       success: function(resp) {
         modalavail.style.display = "block";
         for (var checkbox of markedCheckbox) {
         console.log(checkbox.value + ' ');
       }
       },
       error: function (request, status, error) {
         console.log(request.responseText);
         showAjaxFormErrors(JSON.parse(request.responseText));
         $('html, body').animate({ scrollTop: 0 }, 50);
         },
      });
   });

这是我的 HTML...

检查可用性

  <div class="table56">

    {% for entry in form.approvers %}

      <table class="table57">
        <thead>
          <tr>
            <th class="title156">Name</th>
            <th class="title118">Available?</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td class="title156">{{ entry.name }}</td>
            {% if not start_conflict or end_conflict or during_conflict %} 
            <td class="title117">Yes</td>
            {% else %}
            <td class="title117">No</td>
            {% endif %} 
          </tr>
        </tbody>
      </table>
    {% endfor %}
  </div>
  <input type="hidden" id="modal-approvers">
  <button type="button" class="button210" id="modalcloseavail">Close</button>
</div>

这是我的表格...

class DailyPlannerForm(forms.ModelForm):
    class Meta:
    model = NewDailyPlannerEvent
    exclude = [ 'created_by','summary']

def __init__(self, user, *args, **kwargs):
    start_time = kwargs.pop('start_time', None)
    User = get_user_model()
    super(DailyPlannerForm, self).__init__(*args, **kwargs)
    self.fields['approvers'] = forms.ModelMultipleChoiceField(
                            widget=forms.CheckboxSelectMultiple(),
                            queryset=User.objects.exclude(Q(is_active=False)).order_by('last_name','first_name'),required=False)

def clean(self):
    cleaned_data = super(DailyPlannerForm, self).clean()
    approvers = cleaned_data.get('approvers')

这是我的模型......

class DailyPlannerEvent(models.Model):

    STATUS_CHOICES = (
    ("AwaitingResponse","AwaitingResponse"),
    ("Cancelled","Cancelled"),
    ("Declined","Declined"),
    ("Delete","Delete"),
    ("Saved","Saved"),
    ("Scheduled","Scheduled"),
    ("Submitted","Submitted"),
)

STATUS_CHOICES1 = (
    ("Cancel","Cancel"),
)

STATUS_CHOICES3 = (
    ("True","True"),
    ("False","False"),
    ("N/A","N/A")
)

approver_by_department = models.ManyToManyField(Department,related_name="new_daily_planner_event_approver_by_department")
approvers = models.ManyToManyField(User)
created_by = models.ForeignKey(User,null=True,on_delete=models.CASCADE,related_name='new_daily_planner_event_created_by')
creation_date = models.DateTimeField(editable=False,null=True)
daily_planner_event_creation_date = models.DateTimeField(editable=False,null=True)
daily_planner_event_name = models.CharField(max_length=255,blank=True)
end_time = models.DateTimeField(null=True,blank=True)
last_update = models.DateTimeField(null=True)        
request_type = models.CharField(choices=REQUEST_TYPE,default="New Daily Planner Event Request",max_length=35)
start_time = models.DateTimeField(null=True,blank=True)
status = models.CharField(choices=STATUS_CHOICES,default="Submitted",max_length=20)
submitted = models.CharField(choices=STATUS_CHOICES3,default="False",null=True,blank=True,max_length=20)

我最终计划做一些我认为的事情......

def get_context_data(self, **kwargs):
    context = super(DailyPlannerEventView, self).get_context_data(**kwargs)
    start_conflict = DailyPlannerEvent.objects.filter(
                     start_time__range=(dailyplannerevent.start_time,
                                        dailyplannerevent.end_time,approver=user))
    end_conflict = DailyPlannerEvent.objects.filter(
                   end_time__range=(dailyplannerevent.start_time,
                                    dailyplannerevent.end_time,approver=user))
    during_conflict = DailyPlannerEvent.objects.filter(
                      start_date__lte=dailyplannerevent.start_time, 
                      end_date__gte=dailyplannerevent.end_time,approver=user)
    context['start_conflict'] = start_conflict
    context['end_conflict'] = end_conflict
    context['during_conflict'] = during_conflict
    return context

我现在的问题是 HTML 中的这一行....

{% for entry in form.approvers %}

我不知道如何“获取”在翻译为这一行的表单中选择的批准者...我试图获取上下文...它出现的行显然向我显示了我的每个条目批准者变量...我只想要用户选择的变量...然后我想在用户单击“显示可用性”按钮后在 HTML 中显示它们是否“可用”。

现在这相当复杂,但我很欣赏任何想法。

谢谢!

javascript django django-views django-forms django-templates
1个回答
0
投票

好吧,简短的答案就是我正在寻找的...是 APIVIEW...它允许您在提交表单之前显示表单值。

我做了类似的事情...

class AvailabilityCheckView(views.APIView):

    def get(self, request):
        approvers = self.request.GET.getlist('approvers[]')
        start_time = self.request.GET.get('start_time')
        end_time = self.request.GET.get('end_time')

然后从那里使用 Ajax 获取值并通过 Jquery 处理它们以将它们显示到屏幕上。

© www.soinside.com 2019 - 2024. All rights reserved.