Всякий раз, когда метод хочет изменить получателя, он должен быть указателем на значение; метод должен иметь приемник указателя.
Если у метода есть приемник без указателя, копия будет выполнена и передана при вызове этого метода. С этого момента, независимо от того, что вы делаете с получателем, вы можете изменить только копию, а не оригинал.
Итак, в вашем примере:
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
}
Это все, что нужно.
Вы можете создать собственный виджет:
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()
}
Нет необходимости в подклассе DateInput
.
class MyModelForm(forms.ModelForm):
class Meta:
model = MyModel
fields = '__all__'
widgets = {
'my_date': DateInput(attrs={'type': 'date'})
}
Используя пакет django-widget-tweaks , вы можете сделать это довольно просто с помощью:
{% load widget_tweaks %}
{{form.date|attr:"type:date"}}
и создания поля поля даты в вашем классе:
date = forms.DateField()
render_field
того же пакета, но теперь он перестает работать. Недавно я обновился до Django 1.11, возможно, он больше не совместим ...
– Jorge Orpinel
21 February 2018 в 04:43