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