【问题标题】:django: How to set date and time to server from clientdjango:如何从客户端设置日期和时间到服务器
【发布时间】:2015-07-16 09:14:35
【问题描述】:

我试图简化我的情况:

我有两台 PC,PC1(“服务器”)不在网络上,而 PC2(“客户端”)可以在网络上冲浪(他们通信彼此之间)。

进入 PC1 我有我的 Django 项目、DB 等。而使用 PC2 我可以通过浏览器访问我的项目等等。

我想达到这个目标:

PC1 自动从 PC 2 获取日期和时间,并且在 PC 1 中的每个动作都参考 PC2 的时间和日期。

| PC1 (server-side) | <--datetime--- | PC2 (client-side) |<----- datetime from web

其实我可以用一些js来获取客户端的日期时间:

datetime.js

$(document).ready(function(){


    var myVar=setInterval(function(){myTimer()},1000);
    function myTimer() {
    var myDate = new Date();
    var strDate = myDate.getFullYear()+ "-" +(myDate.getMonth()+1)+ "-" +myDate.getDate();
    var strTime = myDate.getHours()+ ":" + myDate.getMinutes() +":" + myDate.getSeconds();

    document.getElementById("data").innerHTML = myDate.toLocaleString();

}       


})

models.py

from django.db import models

class ProvaTime(models.Model):
    somewords = models.CharField(max_length=30)
    myauthor = models.ForeignKey('auth.User', null=True, blank=False)
    created_date = models.DateTimeField()   # how tell it to pick js timedate?



    def save(self, *args, **kwargs):
        super(ProvaTime, self).save(*args, **kwargs)

forms.py

from django import forms
from .models import ProvaTime

class ProvaTimeForm(forms.ModelForm):

    class Meta:
        model =  ProvaTime
        fields = ('somewords',)

views.py

def testime(request):

    elements =ProvaTime.objects.filter().order_by('-created_date')
    if request.method == 'POST':
        form = ProvaTimeForm(request.POST)
        if form.is_valid():
            obj = form.save(commit=False)
            obj.author = request.user
            obj.save()
    else:
        form = ProvaTimeForm()

    return render(request, 'provapp/testime.html', {'form': form, 'elements': elements})

def myviewtomodel(request): # how to do?

provapp/testtime.html

<form action="/testime/" method="post">
    {% csrf_token %}
    {{ form.as_table }}
    <input type="submit" value="LIST" />
</form>


  <br />
  <br />        

                    <div class="table-responsive">
                        <table class="table table-bordered">
                            <tr class="info">
                            <td width="15%" align="center">SOMETHING WORDS</td>
                            <td width="15%" align="center"> CREATION DATETIME </td>
                            <td width="15%" align="center"> AUTHOR </td>
                            <td>


                            </td>
                            {% for stuff in elements %}
                                <div class="stuff">
                                    <tr>

                                    <td>{{stuff.somewords}}</td> 
                                    <td>{{stuff.created_date}}</td>
                                    <td>{{stuff.myauthor}}</td>
                                </div>

                            {% endfor %}
                        </table>
                    </div>

如何将 JS 日期时间发送到 models.py?

【问题讨论】:

    标签: javascript django datetime django-models


    【解决方案1】:

    您应该明确地将 javascript 日期传递给您的模型。

    model.created_date = date_from_javascript

    由于您已将created_date 的默认值设置为timezone.now,因此当没有任何内容传递给它时,它将使用服务器的时区。

    例如

    $.ajax({
        url: '/myview/',
        data: {'javascript_date' : javascript_date},
        method: 'post',
        ....
    });
    

    在您的 Django 视图中:

    def MyView(request):
        javascript_date = request.POST['javascript_date']
        m = MyModel(created_at=javascript_date)
        m.save()
    

    【讨论】:

    • 如何定义date_from_javascript
    • 你可以通过javascript将它传递给你的django视图。
    • 是否有 django 函数可以从客户端选择日期时间?
    • @DigitalDouble:我很难弄清楚你写在这里的变量......请你再详细一点吗?
    • 例如m = MyModel(created_at=javascript_date) m.save() 以及我如何在 models.py 中调用 m ...例如喜欢:m=models.DateTimeField()?
    【解决方案2】:

    我建议不要将客户时间直接保存在数据库中。因为虽然有多个具有不同时区的客户端,但一个客户端会看到错误的时间,因为它是在不同的时区创建的。我建议您使用session 保存偏移值(或数据库)并使用它来显示数据。

    现在让我们在主页或其他页面发出 ajax 请求,将偏移量数据从浏览器发送到服务器。

    $(document).ready(function(){
        var now = new Date()
        var value = now.getTimezoneOffset()
    
        $.ajax({
            url: "your-url",
            type: "post", // or "get"
            data: value,
            success: function(data) {
              console.log(data);
            }});
    
    });
    

    向模型添加一个额外的字段以保存该偏移量。还有一个属性方法,稍后将计算用户的本地时间。

    class ProvaTime(models.Model):
        ....
        tz_offset = models.DecimalField(default=Decimal('0.0'),max_digits=3, decimal_places=1)
    
        @property
        def get_local_time(self):
            return create_time - datetime.timedelta(tz_offset)
    

    并 ajax 视图

    import json
    def post(request):
      if request.POST():
          data = {}
          try:
             get_value= request.body
             prova_times = ProvaTime.objects.filter(myauthor=request.user)
             if prova_times.exists():
                 for prova_time in prova_times:
                     prova_time.tz_offset = get_value
                     prova_time.save()
             data['success'] = 'Success'
             return HttpResponse(json.dumps(data), content_type="application/json")
          except Exception as e:
             data['error'] = e
             return HttpResponse(json.dumps(data), content_type="application/json")
    

    现在显示数据:

    def myviewtomodel(request):
        context = dict()
        context['elements'] = ProvaTime.objects.all()
        return render(request, 'myapp/index.html', context,
            content_type="application/xhtml+xml")
    

    在模板中显示时间(使用get_local_time)。

    <div class="table-responsive">
                            <table class="table table-bordered">
                                <tr class="info">
                                <td width="15%" align="center">SOMETHING WORDS</td>
                                <td width="15%" align="center"> CREATION DATETIME </td>
                                <td width="15%" align="center"> AUTHOR </td>
                                <td>
    
    
                                </td>
                                {% for stuff in elements %}
                                    <div class="stuff">
                                        <tr>
    
                                        <td>{{stuff.somewords}}</td> 
                                        <td>{{stuff.get_local_time}}</td>
                                        <td>{{stuff.myauthor}}</td>
                                    </div>
    
                                {% endfor %}
                            </table>
                        </div>
    

    【讨论】:

    • 客户端没问题..因为只有一个PC2连接到PC1..我必须保存一些数据,这是必要的保存的数据与客户端日期时间一起存储在数据库中,因为 PC1 不得在网上冲浪,因此其日期时间必须与客户端时间一起设置...
    • 然后只需将偏移量存储在数据库中并在显示时间时使用它:)
    • 但是如何告诉 MyModel 选择这个日期时间?实际上它返回:'module'对象没有属性'myview'
    猜你喜欢
    • 2013-04-19
    • 1970-01-01
    • 2013-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-26
    相关资源
    最近更新 更多