В Django, как отображать виджет даты в HTML-форме для модели DateField? [Дубликат]

Всякий раз, когда метод хочет изменить получателя, он должен быть указателем на значение; метод должен иметь приемник указателя.

Если у метода есть приемник без указателя, копия будет выполнена и передана при вызове этого метода. С этого момента, независимо от того, что вы делаете с получателем, вы можете изменить только копию, а не оригинал.

Итак, в вашем примере:

func (p Person) SetName(newName string)  {
    name := p.GetName();
    *name = newName
}

Когда SetName(), копия сделана из Person. Внутри SetName() вы получите адрес поля name копии, которую вы изменяете. (На самом деле, копия копии, подробнее об этом позже ...)

Решение: используйте приемник-указатель:

func (p *Person) SetName(newName string)  {
    name := p.GetName();
    *name = newName
}

Из этого point, только *Person реализует Individual, поэтому используйте указатель при добавлении:

individuals = append(individuals, &person)

Это сложно, потому что после этого он не будет работать. Почему это?

Это потому, что у Person.GetName() все еще есть приемник без указателя:

func (p Person) GetName() *string {
    return &p.name
}

Поэтому, когда GetName() вызывается из SetName(), копия , и GetName() вернет адрес поля name копии, а SetName() изменит только копию, созданную для вызова GetName().

Итак, чтобы сделать все вы также должны использовать приемник указателей для GetName():

func (p *Person) GetName() *string {
    return &p.name
}

И теперь он работает, выводит (попробуйте на Go Playground ):

{Steve}
&{Peter}
{Peter}

Но знайте, что самый простой и рекомендуемый способ - просто:

func (p *Person) SetName(newName string) {
    p.name = newName
}

Это все, что нужно.

5
задан C.B. 3 April 2014 в 19:34
поделиться

3 ответа

Вы можете создать собственный виджет:

from django import forms

class DateInput(forms.DateInput):
    input_type = 'date'

class MyModelForm(forms.ModelForm):
    class Meta:
        model = MyModel
        fields = '__all__'
        widgets = {
            'my_date': DateInput()
        }
15
ответ дан Mike Ivanov 22 August 2018 в 14:29
поделиться

Нет необходимости в подклассе DateInput.

class MyModelForm(forms.ModelForm):
    class Meta:
        model = MyModel
        fields = '__all__'
        widgets = {
            'my_date': DateInput(attrs={'type': 'date'})
        }
10
ответ дан jhrr 22 August 2018 в 14:29
поделиться

Используя пакет django-widget-tweaks , вы можете сделать это довольно просто с помощью:

{% load widget_tweaks %}
{{form.date|attr:"type:date"}}

и создания поля поля даты в вашем классе:

date = forms.DateField()
2
ответ дан MyCah 22 August 2018 в 14:29
поделиться
  • 1
    Раньше я использовал это, но использовал тег шаблона render_field того же пакета, но теперь он перестает работать. Недавно я обновился до Django 1.11, возможно, он больше не совместим ... – Jorge Orpinel 21 February 2018 в 04:43
Другие вопросы по тегам:

Похожие вопросы: