【问题标题】:Django converting year to a full dateDjango将年份转换为完整日期
【发布时间】:2020-06-04 12:44:57
【问题描述】:

在我的书应用程序中,我在模型中有一个日期字段,但作为 REST 请求的输入,有时我得到的只是一年,甚至是完整的日期,但它是一个字符串格式。我想首先创建一个手动表单来添加我不知道确切出版日期的书籍,尽管一年。

所以我想要做的是在只有一年的情况下添加“01/01”并转换为日期 ".strptime(s, "%Y-%m-%d").date()"。但这不起作用,日期字段默认验证器阻止我传递除“yyyy-mm-dd”格式输入之外的任何内容。我可以以某种方式覆盖默认的验证或停止通过表单启动它吗?有什么建议可以解决这个问题吗?

型号:

class Book(models.Model):

title = models.CharField(max_length=100)           
publication_date = models.DateField()   
authors = models.ManyToManyField("Author", related_name="author")
ISBN = ISBNField() #validators=[book_unique_validator,]
pages = models.IntegerField(validators=[page_validator,], blank=True)
language = models.CharField(max_length=4)

def __str__(self):
    return self.title

观看次数:

class BookAddView(FormView):
    model = Book
    template_name = "Books/create_book.html"    
    form_class = BookForm
    success_url = reverse_lazy("book_list")

    def form_valid(self, form):    
        if Book.objects.filter(ISBN=form.cleaned_data["ISBN"]).count() > 0:
            messages.warning(self.request, f'Book "{form.cleaned_data["ISBN"]}" already exist in database.')
            return redirect("book_details", pk=Book.objects.get(ISBN=form.cleaned_data["ISBN"]).pk)
        else:
            if len(publication_date=form.cleaned_data['publication_date']) == 4:
                book_date = (form.cleaned_data['publication_date'] + "01/01").strptime(s, "%Y-%m-%d").date()
            else:
                book_date = publication_date=form.cleaned_data['publication_date']
        new_book = Book(
                    title=form.cleaned_data["title"].lower(),                    
                    publication_date=book_date,
                    ISBN=form.cleaned_data["ISBN"],
                    pages=form.cleaned_data["pages"],
                    language=form.cleaned_data["language"]
                )
            authors = Author.objects.filter(pk__in=form.cleaned_data["authors"])
            new_book.save()
            for author in authors:
                new_book.authors.add(author)
            new_book.save()
            pk = new_book.pk
            return redirect("covers_add", pk=pk)

表格:

class BookForm(forms.ModelForm):
    title = forms.CharField()
    publication_date = forms.CharField()
    authors = forms.ModelMultipleChoiceField(Author.objects.all())
    ISBN = ISBNField()
    pages = forms.IntegerField()
    language = forms.CharField()

    class Meta:
        model = Book
        fields = ["title", "publication_date", "authors", "ISBN", "pages", "language"]

【问题讨论】:

    标签: python django date


    【解决方案1】:

    当只提供年份时,您可以将yearmonthday 传递给datetime.datetime 类。

    import datetime
    
    if len(publication_date=form.cleaned_data['publication_date']) == 4:
        book_date = datetime.datetime(int(form.cleaned_data['publication_date']), month=1, day=1).date()
    

    datetime.datetime(int(form.cleaned_data['publication_date']), month=1, day=1) 将返回一个 datetime.datetime 对象。所以你可以很容易地从中得到date()

    进一步阅读datetime Objects

    【讨论】:

    • 但是 DateField() 验证器仍然阻止我将一年作为日期的输入值传递。我可以以某种方式将其关闭吗?
    • 我没有得到你提到的内容。您指的是哪个验证器?在您的代码中,我没有看到任何验证器。请解释
    • 在我的模型中我有 DateField() 和 forms.ModelForm 我已经通过另一个字段 == CharField 传递了相同的参数名称,当我在那里输入“1992”时我得到错误“请插入正确的日期格式 YYYY-MM-DD”。
    • 这就是这段代码的作用,datetime.datetime(int(form.cleaned_data['publication_date']), month=1, day=1).date() 将返回一个日期时间对象。您可以将其传递给str(),它将返回YYYY-MM-DD 格式的字符串。我想我仍然缺少一些东西。
    猜你喜欢
    • 2020-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-07
    • 2018-05-10
    • 1970-01-01
    相关资源
    最近更新 更多