django modelform foreignkey更新

时间:2017-10-29 16:30:43

标签: python django django-models django-forms django-views

我的模型如下:

class Event(models.Model):
    EventId = models.UUIDField(primary_key=True)
    Winner = models.ForeignKey('Participant', on_delete=None)

class Participant(models.Model):
    ID = models.UUIDField(primary_key=True)
    Name = models.CharField()

我正在尝试使用form.py

更新Event对象的现有实例
class UpdateWinner(ModelForm):
    def __init__(self, *args, **kwargs):
        e = kwargs.pop('e', '')
        super(UpdateWinner, self).__init__(*args, **kwargs)
        self.fields['Winner'] = forms.ModelChoiceField(queryset=e))

    class Meta:
        model = Event
        fields = '__all__'

和views.py

def update_winner(request, event_id):
        if request.method == 'POST':
            form = UpdateWinner(request.POST, instance=Event.objects.get(EventId=event_id))
            if form.is_valid():

       else:
          event_par = Participant.objects.filter(some query)
          form = UpdateWinner(instance=event, e=event_par)

我通过打印eventid进行检查,正确的值正在通过。但由于某种原因,Winner字段导致form.is_valid()函数出现一些错误,我收到错误“'str'对象没有属性'model'”。任何人都可以帮助我吗

2 个答案:

答案 0 :(得分:1)

由于您在视图中处理POST请求时未提供e kwarg,因此您的自定义__init__函数会设置e = ''。当您去定义查询集时,这会导致错误 - 该空字符串没有属性model。尝试:

class UpdateWinner(ModelForm):
    def __init__(self, *args, **kwargs):
        e = kwargs.pop('e', None)
        super(UpdateWinner, self).__init__(*args, **kwargs)
        if e is not None:
            self.fields['Winner'] = forms.ModelChoiceField(queryset=e))

答案 1 :(得分:0)

错误来自使用该行:

e = kwargs.pop('e', '')

这意味着,如果密钥e不在kwargs返回''。然后你在那里使用它:

 self.fields['Winner'] = forms.ModelChoiceField(queryset=e))

导致空的查询集。