Python Django:geolocation应用程序中ForeignKey的自定义小部件

Python Django:geolocation应用程序中ForeignKey的自定义小部件,python,django,geolocation,widget,foreign-keys,Python,Django,Geolocation,Widget,Foreign Keys,我正在开发一个管理网站位置的应用程序。此应用程序(位置)包含模型(简化): 因此,其他希望存储位置的应用程序和模型实际上包含此模型的ForeignKey。 此外,locations应用程序定义了一个小部件,该小部件不显示与ForeignKey字段关联的典型select,而是呈现由javascript支持的google地图,该javascript将纬度、经度和地址保存在HiddenInput字段中(也简化了): 其思想是,需要使用位置的任何其他模型都有一个与位置模型关联的ForeignKey字段,

我正在开发一个管理网站位置的应用程序。此应用程序(位置)包含模型(简化):

因此,其他希望存储位置的应用程序和模型实际上包含此模型的ForeignKey。 此外,locations应用程序定义了一个小部件,该小部件不显示与ForeignKey字段关联的典型select,而是呈现由javascript支持的google地图,该javascript将纬度、经度和地址保存在HiddenInput字段中(也简化了):

其思想是,需要使用位置的任何其他模型都有一个与位置模型关联的ForeignKey字段,例如:

class Event(models.Model):
    """
    `Events` main model.
    """

    title = models.CharField(_('title'), max_length=100, blank=True)
    """ Title. """

    place = models.ForeignKey(Location, verbose_name=_('place'), related_name="place", blank=True)
    """ Location. """

    meeting_point = models.ForeignKey(Location, verbose_name=_('place'), related_name="meeting_point", blank=True)
    """ Meeting Point """

    duration = models.PositiveIntegerField(_('duration days'), blank=True)
    """ Duration, specified in days. """

    price = models.DecimalField(_('price'), max_digits=7,  decimal_places=2, blank=True)
    """ Price. """
因此,当您发送表单时(除了按惯例保存所有其他模型字段外),将使用提供的位置信息(纬度、经度和地址)创建一个新的位置对象,并将其存储在数据库中。最后,使用这个新的Location对象建立与ForeignKey字段的关系(在以前的模型中为“place”)

目前,除了用纬度、经度和方向填充HiddenInput外,该小部件工作正常,并呈现地图,而不是典型的select小部件

在my events/forms.py中:

class NewEventForm(forms.ModelForm):

    def save(self):

        value = self.data['place'].split(',');
        location = Location(latitude=value[0], longitude=value[1], address=value[2:])
        self.instance.place = location

        new_event = super(NewEventForm, self).save(commit=False)
        new_event.save()

        return new_offer

    class Meta:
        model = Event
        fields = ('title', 'duration', 'price', 'place')
        widgets = {
                    'place': LocationEditWidget(),
                   }
在my events/views.py中:

@login_required
def event_new(request):
    new_event = Event(price=0, owner=request.user)

    if request.method == 'POST':
        # Form submited
        Event_form = NewEventForm(request.POST, instance=new_event)

        if event_form.is_valid():
            # Form succesfully validated
            event_form.save()
            return HttpResponseRedirect('/Event/%s/edit' % new_event.id) 

    else:
        # Initial form
        event_form = NewEventForm(instance=new_event)

    return render_to_response(  'events/event_new.html',
                                {'event_form':event_form},
                                context_instance=RequestContext(request))
但是我是Django的新手,我在理解小部件、表单、字段和表单字段之间的关系时遇到了一些问题。问题是表单没有正确验证,如果我强制验证(通过使用“event_form.is_valid()”),则在保存到数据库时会出现错误。另一方面,必须为每个使用位置的应用程序/模型子类化ModelForm(因为DRY)似乎并不完全正确

我需要创建自定义字段和自定义表单字段吗? 有没有关于如何定位的想法? 我可以使用小部件创建ForeingKey吗

提前谢谢,请原谅我的英语不好

class NewEventForm(forms.ModelForm):

    def save(self):

        value = self.data['place'].split(',');
        location = Location(latitude=value[0], longitude=value[1], address=value[2:])
        self.instance.place = location

        new_event = super(NewEventForm, self).save(commit=False)
        new_event.save()

        return new_offer

    class Meta:
        model = Event
        fields = ('title', 'duration', 'price', 'place')
        widgets = {
                    'place': LocationEditWidget(),
                   }
@login_required
def event_new(request):
    new_event = Event(price=0, owner=request.user)

    if request.method == 'POST':
        # Form submited
        Event_form = NewEventForm(request.POST, instance=new_event)

        if event_form.is_valid():
            # Form succesfully validated
            event_form.save()
            return HttpResponseRedirect('/Event/%s/edit' % new_event.id) 

    else:
        # Initial form
        event_form = NewEventForm(instance=new_event)

    return render_to_response(  'events/event_new.html',
                                {'event_form':event_form},
                                context_instance=RequestContext(request))