简体   繁体   English

将request.user传递给Django中的modelformset_factory()

[英]Pass request.user to modelformset_factory() in Django

My goal is to create a modelformset that has a field which is a foreignkey to another model. 我的目标是创建一个具有一个字段的modelformset,该字段是另一个模型的外键。 I want to restrict the drop down in the foreign key field depending on the user that is logged in. 我想限制外键字段中的下拉列表,具体取决于登录的用户。

models.py models.py

class WeeklyWinner(models.Model):
    league = models.ForeignKey('League')
    week = models.IntegerField()
    manager = models.ForeignKey('Managers')

class League(models.Model):
    league_name = models.CharField(max_length=30)
    number_players = models.IntegerField()
    league_fee = models.IntegerField()
    commissioner = models.ForeignKey(User)
    deadline_date = models.DateField(help_text='Date league fees are due')
    fine = models.IntegerField(help_text = 'Amount you will charge fantasy managers that pay late', )
    draft_date = models.DateField(blank=True, null=True, help_text='Not Required')
    transaction_amount = models.IntegerField(help_text='Amount your league will charge for each transaction at the end of the season', )
    payment_info = models.TextField(blank=True, help_text='Instruct your league managers on how to pay up.  You can place in a paypal link, venmo or tell them to pay you straight cash.')
    notes = models.TextField(blank=True, help_text='This information will be included in the email that will be sent to league managers.  Provide any extra information on your league that you want them to know.')
    number_weeks = models.IntegerField(blank=True, null=True, help_text='Number of weeks your league contains.  This is used to determine the number of weekly winners.')
    def __unicode__(self):
        return self.league_name

class Managers(models.Model):
    league = models.ForeignKey('League')
    team_name = models.CharField(max_length=30)
    first_name_1 = models.CharField(max_length=30)
    last_name_1 = models.CharField(max_length=30)
    email_1 = models.EmailField()
    first_name_2 = models.CharField(max_length=30, null=True, blank=True)
    last_name_2 = models.CharField(max_length=30, null=True, blank=True)
    email_2 = models.EmailField(null=True, blank=True)
    def __unicode__(self):
        return self.team_name

forms.py forms.py

class WeeklyWinnerForm(ModelForm):
    def __init__(self, *args, **kwargs):
        self.user = kwargs.pop('user', None)
        super(WeeklyWinnerForm, self).__init__(*args, **kwargs)
        self.fields['manager'].queryset = Managers.objects.filter(league_id = 2)
        print self.user

    class Meta:
        model = WeeklyWinner
        fields = ['week', 'manager']

views.py views.py

def weeklywinner(request):
    league = get_object_or_404(League, commissioner=request.user)
    weeklywinner = WeeklyWinner.objects.filter(league_id=league)
    weeklywinnerformset = modelformset_factory(WeeklyWinner, form=WeeklyWinnerForm, max_num=10)
    form_data = request.POST if request.method == 'POST' else None
    form = weeklywinnerformset(data=form_data)
    if form.is_valid():
        form.save()
        return redirect('/dashboard')
    return render(request, 'settings.html', {'form': form})

In my forms.py if i set league_id to a hardcoded number I get my desirable results. 在我的forms.py中,如果我将League_id设置为硬编码数字,则会得到理想的结果。 To pull this off I need to pass request.user to my form/formset but any attempt to pass the user variable as so: 为了实现这一点,我需要将request.user传递到我的表单/ formset,但是要这样传递用户变量的任何尝试:

form = weeklywinnerformset(data=form_data, user=request.user)

I get the following error code: 我收到以下错误代码:

Environment:


Request Method: GET
Request URL: http://127.0.0.1:8000/weeklywinner/

Django Version: 1.5.8
Python Version: 2.7.6
Installed Applications:
('django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'django.contrib.sites',
 'ledger',
 'allauth',
 'allauth.account',
 'allauth.socialaccount',
 'after_response')
Installed Middleware:
('django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware')


Traceback:
File "/Library/Python/2.7/site-packages/django/core/handlers/base.py" in get_response
  113.                         response = callback(request, *callback_args, **callback_kwargs)
File "/Users/tightflks/Documents/EAV/clients/fantasy/fantasy_development/ledger/views.py" in weeklywinner
  379.     form = weeklywinnerformset(data=form_data, user=request.user)
File "/Library/Python/2.7/site-packages/django/forms/models.py" in __init__
  441.         super(BaseModelFormSet, self).__init__(**defaults)

Exception Type: TypeError at /weeklywinner/
Exception Value: __init__() got an unexpected keyword argument 'user'

Django内部在modelformset_factory中使用modelform_factory函数,该函数不考虑任何覆盖的方法或自定义字段,它仅使用给定的Form类的Meta属性(在您的情况下为“ WeeklyWinnerForm”),例如字段,排除等,因此从不调用WeeklyWinnerForm的init ,为此,您必须实现自定义modelformset_factory。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM