在下面的Form类中,我让用户输入街道名称,数字和邮政编码。
class MeldingForm(forms.ModelForm):
street = forms.CharField(max_length=256, help_text="Street: ")
number = forms.CharField(max_length=10, help_text="Number: ")
zip = forms.ChoiceField(choices=((34000, 'TownA'), (34001, 'TownB'),
(34010, 'TownC'), (34012, 'TownD')))
我想通过使用这三个字段的值(字符串)自动提取坐标。我定义了一个方法get_closest_coords(),它将这3个字符串作为参数(并且在其他场合下工作得非常好)并在类定义中尝试了这个,所以我可以将值赋给坐标变量。
lat, lng = get_closest_coords(street.__str__(), number.__str__())
coord_lat = forms.FloatField(widget=forms.HiddenInput(), initial=lat)
我已经尝试了各种方法来访问这些字段的字符串值,但现在没有一个工作...
好吧,我在此期间自己解决了这个问题。它实际上非常简单。我的问题基本上表明我没有完全掌握Django的工作原理。
您无法在类定义中为属性设置新值(默认值除外)。适当的地方是你的应用程序的views.py文件(我认为)。以下是我如何解决它:
class MeldingForm(forms.ModelForm):
street = forms.CharField(max_length=256, help_text="Street: ")
number = forms.CharField(max_length=10, help_text="Number: ")
zip = forms.CharField(max_length=4, initial='34000')
在app的views.py文件中,在add_Melding函数的定义中,我添加了以下部分(在检查表单条目的有效性等之后...)
def add_Melding(request):
melder = request.user
form = MeldingForm(request.POST)
melding = form.save(commit=False)
melding.melder = melder
melding.coord_lng, melding.coord_lat = get_closest_coords(melding.street, melding.number, melding.zip)
melding.save()
因此,线索是首先设置表单条目,而不提交它们(commit = false),然后分配新值(在本例中为melder和坐标),然后正确保存表单。希望这可以帮助!如果您有更好的建议,请随时发表评论!