Saya sedang mengerjakan aplikasi web ini yang memungkinkan orang masuk, dan dapat membuat: pengguna, membuat bir, dan ulasan untuk berbagai jenis bir.

Ini model.py saya untuk membuat bir:

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

Ini form.py saya:

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__'

Dan ini adalah views.py saya:

@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})

Seperti yang Anda lihat, untuk membuat bir, Anda perlu mengisi beberapa detail termasuk bidang "Pengguna".

Jadi tujuan saya adalah untuk dapat membatasi Pengguna tertentu yang saya pilih untuk dapat membuat satu bir per hari saja.

Ada pikiran? Saya sedang mencari seledri, tapi saya yakin ada cara yang jauh lebih baik.

Antonius

2
Anthony 31 Agustus 2017, 03:13

2 jawaban

Jawaban Terbaik

Anda mungkin ingin menambahkan bidang tanggal waktu untuk disimpan saat bir dibuat.

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)

Kemudian Anda harus memperbarui tampilan Anda untuk memeriksa apakah ada bir yang dibuat dalam satu hari.

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})
3
eman.lodovice 31 Agustus 2017, 00:33

Hal pertama yang harus Anda lakukan adalah membuat DateField di BeerModel:

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)

Kemudian, jika Anda ingin menerapkan ini di tingkat database, Anda dapat membuat batasan unique_together:

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

Atau Anda bisa memiliki metode clean pada formulir untuk memeriksa ini:

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")

Anda mungkin akan selalu membutuhkan clean, karena tiket yang saya sebutkan di atas (jika masih berlaku). Jika Anda menggunakan bidang yang dapat diedit untuk tanggal, Anda harus memastikan hari ini disimpan ke database. Misalnya:

if beer.is_valid():
    instance = beer.save(commit=False)
    instance.created = datetime.now().date()
    instance.save()
5
Paulo Almeida 31 Agustus 2017, 01:11