将用户实例的表格填写为每天一次(Django)



我正在使用此Web应用程序,该应用程序让人们登录并能够创建:用户,为不同类型的啤酒创建啤酒和评论。

这是我的模型。

from django.db import models
from django.conf import settings
# Models
User = settings.AUTH_USER_MODEL
class BeerModel(models.Model):
    user = models.ForeignKey(User, default=1)
    name = models.CharField(max_length=254, default="")
    style = models.CharField(max_length=254, default="")
    ibu = models.IntegerField(default="")
    calories = models.IntegerField(default="")
    abv = models.IntegerField(default="")
    location = models.CharField(max_length=254, default="")
    class Meta:
        verbose_name_plural = 'Beers'
    def __str__(self):
        return self.name
    def avg(self):
        return

这是我的forms.py:

from django import forms
from django.contrib.auth.models import User
from .models import BeerModel, RateModel
# Forms
class UserForm(forms.ModelForm):
    password = forms.CharField(widget=forms.PasswordInput())
    class Meta:
        model = User
        fields = ('username', 'email', 'password')
        help_texts = {
            'username': None,
        }
class NewBeerForm(forms.ModelForm):
    name = forms.CharField(label="Beer Name")
    ibu = forms.IntegerField(label="IBU")
    abv = forms.IntegerField(label="ABV")
    location = forms.CharField(label="Brewery Location")
    class Meta:
        model = BeerModel
        fields = '__all__'

这是我的Views.py:

@login_required
def new_beer(request):
    if request.method == "POST":
        beer = NewBeerForm(request.POST)
        if beer.is_valid():
            beer.save(commit=True)
            return HttpResponseRedirect(reverse('beer_tracker:home'))
    else:
        beer = NewBeerForm()
    return render(request, 'beer_tracker/new_beer.html', {'beer':beer})

您可以看到,要创建啤酒,您需要填写几个细节,包括"用户"字段。

所以我的目标是能够限制我选择只能每天创建一杯啤酒的特定用户。

有什么想法吗?我正在研究芹菜,但我敢肯定有更好的方法。

安东尼

您要做的第一件事就是在BeerModel中创建DateField

class BeerModel(models.Model):
    ...
    created = models.DateField(default=django.utils.timezone.now)
    # or (but see https://code.djangoproject.com/ticket/20180)
    # created = models.DateField(auto_now_add=True)

然后,如果要在数据库级别执行此功能,则可以创建一个unique_together约束:

class BeerModel(models.Model):
    ...
    class Meta:
        unique_together = ('user', 'created')

,或者您可以在表格上使用clean方法来检查以下方式:

class NewBeerForm(forms.ModelForm):
    ...
    def clean(self):
        cleaned_data = super().clean() 
        user = cleaned_data.get('user')
        created = datetime.now().date()           
        if BeerModel.objects.filter(user=user, created=created).exists():
            raise forms.ValidationError("User already created beer today")

您可能总是需要clean,因为我上面提到的票(如果仍然适用)。如果您在日期使用可编辑字段,则必须确保将当天保存到数据库中。例如:

if beer.is_valid():
    instance = beer.save(commit=False)
    instance.created = datetime.now().date()
    instance.save()

创建啤酒时可能需要添加DateTime字段以存储。

class BeerModel(models.Model):
    user = models.ForeignKey(User, default=1)
    name = models.CharField(max_length=254, default="")
    style = models.CharField(max_length=254, default="")
    ibu = models.IntegerField(default="")
    calories = models.IntegerField(default="")
    abv = models.IntegerField(default="")
    location = models.CharField(max_length=254, default="")
    created = models.DateTimeField(auto_now_add=True)

然后,您将必须更新您的视图,以检查一天之内是否有啤酒。

from django.utils import timezone

@login_required
def new_beer(request):
    if request.method == "POST":
        yesterday = timezone.now() - timezone.timedelta(days=1)
        if BeerModel.objects.filter(user=request.user, created__gt=yesterday).exists():
            return HttpResponseForbidden()   # return a 403 status code
        beer = NewBeerForm(request.POST)
        if beer.is_valid():
            beer.save(commit=True)
            return HttpResponseRedirect(reverse('beer_tracker:home'))
    else:
        beer = NewBeerForm()
    return render(request, 'beer_tracker/new_beer.html', {'beer':beer})

最新更新