0

Whenever I try to access my form in the admin page I get the following error.

TypeError at /admin/scoring/score/add/ super(type, obj): obj must be an instance or subtype of type

at the line

AdminForm = super(ScoreForm, self).get_form(request, obj, **kwargs)

I am trying to access the session during form initialization so I can persist what was selected in the menu widget throughout the length of the session. I am following this post. I can not find what I am doing wrong.

class ScoreForm(forms.ModelForm):
def __init__(self, *args, **kwargs):

    super(ScoreForm, self).__init__(*args, **kwargs)
    self.request = kwargs.pop('request', None)

    standard_events = Event.objects.filter(event_score_type='STD')
    event_widget = self.fields['event'].widget

    choices = []
    for element in standard_events:
        choices.append((element.id, element.name))
    event_widget.choices = choices

def clean_score(self):
    print self.request.session
    print(self.cleaned_data['event'])
    selected_event = Event.objects.get(name=self.cleaned_data['event'])
    if(selected_event.max_score > selected_event.min_score):
        if self.cleaned_data['score'] < 0:
            raise forms.ValidationError("Score Cannot Be Negative")
        elif self.cleaned_data['score'] > selected_event.max_score:
            raise forms.ValidationError("Score Cannot Be Greater Than Best Possible Score of " + str(selected_event.max_score))
        elif self.cleaned_data['score'] < selected_event.min_score:
            raise forms.ValidationError("Score Cannot Be Less Than Worst Possible Score of " + str(selected_event.min_score))
        else:
            return self.cleaned_data['score']
    elif selected_event.max_score < selected_event.min_score:
        if self.cleaned_data['score'] < 0:
            raise forms.ValidationError("Score Cannot Be Negative")
        elif self.cleaned_data['score'] < selected_event.max_score:
            raise forms.ValidationError("Score Cannot Be Less Than Best Possible Score of " + str(selected_event.max_score))
        elif self.cleaned_data['score'] > selected_event.min_score:
            raise forms.ValidationError("Score Cannot Be Greater Than Worst Possible Score of " + str(selected_event.min_score))
        else:
            return self.cleaned_data['score']
    class Meta:
        model = Score


class ScoreAdmin(admin.ModelAdmin):
    form = ScoreForm

    def get_form(self, request, obj=None, **kwargs):

        #Line Below Causes Error
        AdminForm = super(ScoreForm, self).get_form(request, obj, **kwargs)

        class ModelFormMetaClass(AdminForm):
            def __new__(cls, *args, **kwargs):
                kwargs['request'] = request
                return AdminForm(*args, **kwargs)

        return ModelFormMetaClass
Community
  • 1
  • 1
Howard Grimberg
  • 2,128
  • 2
  • 16
  • 28
  • 1
    your trying to get the super() of ScoreForm, but the object is admin.ModelAdmin, not ScoreForm. – monkut Jan 17 '13 at 04:52
  • I tried changing the erroneous line to `AdminForm = super(admin.ModelAdmin, self).get_form(request, obj, **kwargs)` but now I get _'super' object has no attribute 'get_form'_ when I know get_from exists. – Howard Grimberg Jan 17 '13 at 05:23
  • it seems in your example that get_form() is a method of ScoreAdmin, which looks recursive. Where is get_form() method you want to call defined? – monkut Jan 17 '13 at 06:05
  • I want to use super to call the original get_form() method in admin.ModelAdmin. – Howard Grimberg Jan 18 '13 at 02:36
  • did you try, super(ScoreAdmin, self).get_form(...)? – monkut Jan 18 '13 at 03:24

0 Answers0