Django:通过给出月份和日期来设置生日

Django: set birthday just by giving the month and day

提问人:SpicyyRiice 提问时间:11/9/2023 更新时间:11/10/2023 访问量:47

问:

我是 Django 的新手

我想在管理面板中创建一个字段,我们可以通过提供月份和日期来设置用户的生日。现在,我们只能给出日期,但这不是我想要的。例如,我想要 2 个下拉列表,一个用于当天,一个用于月份

enter image description here

我的用户模型如下所示

型:

from django.contrib.auth.models import User



# Create your models here.
class Profile(models.Model):

    birthday = models.DateField(blank=True, null=True)

    def __str__(self):
        return f'{self.user.get_full_name()}'
python django django-models django-admin

评论

0赞 Achille G 11/9/2023
只需使用 charField 和 integerField 并在小部件中渲染它们,然后您可以使用该库从中制作日期时间对象Selectdatetime

答:

0赞 Mahammadhusain kadiwala 11/9/2023 #1

我尝试根据您的要求使用 DateField() 解决这个问题

models.py

from django.db import models
from django.contrib.auth.models import User

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    birthday = models.DateField(blank=True, null=True)

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

admin.py

from django import forms
from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from django.contrib.auth.models import User
from .models import Profile
import datetime

class ProfileAdminForm(forms.ModelForm):
    birthday_month = forms.IntegerField(label='Birthday Month', widget=forms.Select(choices=[(i, i) for i in range(1, 13)]))
    birthday_day = forms.IntegerField(label='Birthday Day', widget=forms.Select(choices=[(i, i) for i in range(1, 32)]))
    birthday_year = forms.IntegerField(label='Birthday Year', widget=forms.Select(choices=[(i, i) for i in range(datetime.datetime.now().year - 200, datetime.datetime.now().year)]))

    class Meta:
        model = Profile
        fields = ['user', 'birthday_month', 'birthday_day', 'birthday_year']

class ProfileAdmin(admin.ModelAdmin):
    form = ProfileAdminForm
    list_display = ['user', 'birthday']

    def save_model(self, request, obj, form, change):
        month = form.cleaned_data['birthday_month']
        day = form.cleaned_data['birthday_day']
        year = form.cleaned_data['birthday_year']

        # Format the date as YYYY-MM-DD
        obj.birthday = f'{year:04d}-{month:02d}-{day:02d}'
        super().save_model(request, obj, form, change)

admin.site.register(Profile, ProfileAdmin)

class CustomUserAdmin(UserAdmin):
    pass

admin.site.unregister(User)
admin.site.register(User, CustomUserAdmin)

浏览器预览

enter image description here

评论

0赞 SpicyyRiice 11/10/2023
有没有办法不在生日中显示生日年份?
0赞 Mahammadhusain kadiwala 11/10/2023
答案:更新的 PL 检查