首页 > 解决方案 > Django DateTimeField 在 shell 和浏览器中显示不同的时间

问题描述

我刚刚在 Django 中制作了一个 Coupon 模型,并在模板中显示了 valid_from 和 valid_till。

django shell ORM 中显示的值是实际创建的时间,从它开始计算 20 天,直到它过期。然而,模板中的那个一直显示当前时间,并从当前时间算起 20 天。

这是我第一次尝试教程之外的东西,我不知道如何确定“修复”,尤其是当 django orm shell 显示正确的时间时。

模型.py

from django.db import models
from django.contrib.auth.models import User
from PIL import Image
from django.utils import timezone
from datetime import timedelta
import uuid


class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    image = models.ImageField(default='default.jpg', upload_to='profile_pics')

    def __str__(self):
        return f'{self.user.username} Profile'

    def save(self, *args, **kwargs):
        super(Profile, self).save(*args, **kwargs)
            
        img= Image.open(self.image.path)
        
        if img.height> 300 or img.width> 300:
            output_size= (300, 300)
            img.thumbnail(output_size)
            img.save(self.image.path)    

def twentydays_coupon():
    return timezone.now()+ timedelta(days=20)

class Coupon(models.Model):
    user= models.OneToOneField(User, on_delete= models.CASCADE)    
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)        
    valid_from= models.DateTimeField(default=timezone.now)
    valid_till= models.DateTimeField(default=twentydays_coupon)

    def __str__(self):
        return f'{self.user.username} Coupon'

视图.py

from django.shortcuts import render, redirect
from django.contrib.auth.forms import UserCreationForm
from django.contrib import messages
from django.contrib.auth.decorators import login_required
from .forms import UserRegisterForm, UserUpdateForm, ProfileUpdateForm
from .models import Coupon

def register(request):
    if request.method == 'POST':
        form = UserRegisterForm(request.POST)
        if form.is_valid():
            form.save()
            username = form.cleaned_data.get('username')
            messages.success(request, f'Your account has been created! {username} is now able to login!')
            return redirect('login')
    else:
        form = UserRegisterForm()
    return render(request, 'users/register.html', {'form': form})

@login_required
def profile(request):
    if request.method == 'POST':
        u_form= UserUpdateForm(request.POST, instance= request.user)
        p_form= ProfileUpdateForm(request.POST, request.FILES, instance= request.user.profile)
        
        if u_form.is_valid() and p_form.is_valid():
            u_form.save()
            p_form.save()
            messages.success(request, f'Your account has been updated!')
            return redirect('profile')

    else:
        u_form= UserUpdateForm(instance= request.user)
        p_form= ProfileUpdateForm(instance= request.user.profile)
            
    context= {
        'u_form': u_form,
        'p_form': p_form,
        'Coupon': Coupon,
    }

    return render(request, 'users/profile.html', context)

profile.html

{% extends "info/base.html" %}
{% load crispy_forms_tags %}
{% block content %}
    <div class="content-section">
      <div class="media">
        <img class="rounded-circle account-img" src="{{ user.profile.image.url }}">
        <div class="media-body">
          <h2 class="account-heading">{{ user.username }}</h2>
          <p class="text-secondary">{{ user.email }}</p>
          <p class="text-secondary">Coupon valid from {{ Coupon.valid_from }}</p>
          <p class="text-secondary">Coupon valid till {{ Coupon.valid_till }}</p>
        </div>
      </div>
        <form method="POST" enctype="multipart/form-data">
            {% csrf_token %}
            <fieldset class="form-group">
                <legend class="border-bottom mb-4">Profile Info</legend>
                {{ u_form|crispy }}
                {{ p_form|crispy }}
            </fieldset>
            <div class="form-group">
                <button class="btn btn-outline-info" type="submit">Update</button>
            </div>
        </form>

    </div>
{% endblock content %}

信号.py

from django.db.models.signals import post_save
from django.contrib.auth.models import User
from django.dispatch import receiver
from .models import Profile, Coupon

@receiver(post_save, sender=User)
def create_profile(sender, instance, created, **kwargs):
    if created:
        Profile.objects.create(user=instance)


@receiver(post_save, sender=User)
def save_profile(sender, instance, **kwargs):
    instance.profile.save()

@receiver(post_save, sender=User)
def create_coupon(sender, instance, created, **kwargs):
    if created:
        Coupon.objects.create(user=instance)

标签: pythonpython-3.xdjangodjango-modelsorm

解决方案


推荐阅读