Django преобразование года в полную дату - PullRequest
0 голосов
/ 20 февраля 2020

В моей заявке на книгу у меня есть поле даты в модели, но в качестве входных данных из запроса REST иногда я получаю только год или даже полную дату, но в виде строкового формата. Сначала я хотел создать ручную форму для добавления книг, где я не знаю точную дату публикации, несмотря на год.

Итак, я пытаюсь получить год, добавив "01/01", и конвертировать в дату с ".strptime (s,"% Y-% m-% d " ).свидание()". Но это не работает, валидатор по умолчанию для поля даты не позволяет мне передавать что-либо еще, кроме ввода формата «гггг-мм-дд». Могу ли я как-то перезаписать defaultaotr по умолчанию или прекратить запуск его с помощью формы? Любое предложение, как решить эту проблему?

Модели:

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

1 Ответ

2 голосов
/ 20 февраля 2020

Вы можете передать year, month и day в класс datetime.datetime, если указан только год.

import datetime

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

datetime.datetime(int(form.cleaned_data['publication_date']), month=1, day=1) вернет объект datetime.datetime. Таким образом, вы можете легко получить date() из этого.

Подробнее читайте datetime Objects

...