2014-12-27 2 views
0

Я пытаюсь переопределить метод get_form()CreateView. Моя веб-страница имеет две идентичные формы - одну для добавления «зарегистрированной» команды, а другую для добавления «незарегистрированной» команды. Если добавляется незарегистрированная команда, я хочу установить для поля team_name формы «Доступно». Как вы можете увидеть в моем коде ниже, я пытался достичь этого путем переопределения метода get_form()Django __init __() получил неожиданный аргумент ключевого слова, используя CreateView

class TeamCreateView(LeagueContextMixin, CreateView): 
    model = Team 
    form_class = TeamForm 
    template_name = "leagueapp/editleague.html" 
    registered = False # the correct value of registered is passed in urls.py depending on the url that gets hit 

    # Overwrite the get_success_url() method 
    def get_success_url(self): 
     return '/league/editleague/' + self.kwargs.get('league_id') 

    def get_form(self, form_class): 
     form_kwargs = self.get_form_kwargs() 
     if not self.registered: 
      form_kwargs['team_name'] = "Available" 
     return form_class(**form_kwargs) 

, но это дает мне ошибку __init__() got an unexpected keyword argument 'team_name'. Что я делаю неправильно и/или есть лучший способ сделать это?

Edit: Это мой TeamForm

class TeamForm(ModelForm): 
    class Meta: 
     model = Team 
     fields = ['team_name', 'captain', 'registered', 'team_location', 'phone', 'email', 'team_payment'] 
     widgets = { 
      'team_name':TextInput(attrs={'class':'form-control input-md'}), 
      'captain':TextInput(attrs={'class':'form-control input-md'}), 
      'phone':TextInput(attrs={'class':'form-control input-md'}), 
      'email':TextInput(attrs={'class':'form-control', 'type':'email'}), 
      'team_location':TextInput(attrs={'class':'form-control input-md'}), 
      'team_payment':TextInput(attrs={'class':'form-control'}), 
      'registered':HiddenInput(), 
     } 

ответ

1

Вы определили __init__ метод на TeamForm, что не позволяет аргументе team_name присутствовать именно поэтому вы получаете TypeError при распаковке form_kwargs в это __init__(). Либо обновить __init__ принять новый kwarg или переписать __init__ в

class TeamForm(forms.Form): 
    def __init__(self, *args, **kwargs): 
     #code 
1

Вы не передавайте значения для формирования инициализации, как это. Похоже, что вы хотите сделать, это предоставить пользовательские исходные данные для названия команды, так что вы должны обновить initial Dict:

if not self.registered: 
     form_kwargs.setdefault('initial', {}).update(name="Available") 
+0

Извините, что я принял этот ответ раньше - думал, что это то, что мне нужно, но это не так. Это вызывает ошибку, указывающую, что поле team_name требуется. – Ben

0

Наконец понял, что я мог бы изменить метод get_form как так:

def get_form(self, form_class): 
    if self.registered: 
     myform = super().get_form(form_class) 
    else: 
     myform = TeamForm({'team_name':'Available', 'team_payment':0.00, 'registered':False}) 
    return myform 
Смежные вопросы