【问题标题】:Django: saving the Form does not work (The ModelForm Filters the ForeignKey choices by request.user)Django:保存表单不起作用(ModelForm 通过 request.user 过滤 ForeignKey 选择)
【发布时间】:2020-01-14 06:16:20
【问题描述】:

我设法使用下面的代码通过“request.user”过滤外键选项“Context.name”。 首先,我定义了模型。

models.py

class Extension(models.Model):
   username = models.CharField(primary_key=True, max_length=200, help_text='')
   callerid = models.CharField(max_length=200, help_text='')
   extension = models.CharField(max_length=3, help_text='')
   firstname = models.CharField(max_length=200, help_text='')
   lastname = models.CharField(max_length=200, help_text='')
   password = models.CharField(max_length=200, help_text='')
   context = models.ForeignKey('Context', on_delete=models.SET_NULL, null=True)
   def get_absolute_url(self):
       return reverse('extension-detail', args=[str(self.username)])
   def my_get_absolute_url(self):
       return reverse('my-extension-detail', args=[str(self.username)])
   def __str__(self):
       return self.username

class Context(models.Model):
   name = models.CharField(primary_key=True, max_length=200, help_text='')
   countryprefix = models.CharField(max_length=200, help_text='')
   cityprefix = models.CharField(max_length=200, help_text='')
   number = models.CharField(max_length=200, help_text='')
   extensionsfrom = models.CharField(max_length=200, help_text='')
   extensionstill = models.CharField(max_length=200, help_text='')
   portscount = models.CharField(max_length=200, help_text='')
   def get_absolute_url(self):
       return reverse('context-detail', args=[str(self.name)])
   def my_get_absolute_url(self):
       return reverse('my-context-detail', args=[str(self.name)])
   def __str__(self):
       return self.name

根据这个模型,我创建了一个带有初始部分 init 的 ModelForm,其中将获取用户名。
然后可用的上下文将由用户名过滤。

forms.py

# __init__  stackoverflow.com/questions/291945/how-do-i-filter-foreignkey-choices-in-a-django-modelform/1244586#1244586
# ModelForm learningaboutelectronics.com/Articles/How-to-save-data-from-a-form-to-a-database-table-in-Django.php
# commit    tutorial.djangogirls.org/en/django_forms/#saving-the-form
class MyExtensionCreateForm(forms.ModelForm):
    def __init__(self, context, *args, **kwargs):
        name = kwargs.pop('user')
        super(MyExtensionCreateForm, self).__init__(*args, **kwargs)
        self.fields['context'].queryset = Context.objects.filter(name=name)

    class Meta:
        model = Extension
        fields = '__all__'
#         fields= ["firstname", "lastname", "extension", "password"]

#     def clean_data(self):
#         data = self.cleaned_data
#         # Remember to always return the cleaned data.
#         return data

比在视图中我基本上只想保存到数据库。
表单调用的 user=request.user 部分会将用户名传递给 ModelForm,因此我们可以像在 forms.py 中那样过滤选择。

views.py

def MyExtensionCreate(request):
    # If this is a POST request then process the Form data
    # if request.method == 'POST':
    # Create a form instance and populate it with data from the request (binding) AND pass the username to the Form
    form = MyExtensionCreateForm(request.POST or None, user=request.user)
    # Check if the form is valid:
    if form.is_valid():
        form = form.save(commit=False)
        # process the data in form.cleaned_data as required
        # form.callerid = "Max"
        # form.username = "telba.de_888"
        # form.context = str(request.user)
        # form.context.queryset = Context.objects.filter(name=request.user)
        form.save()
        # Return to the Extensions List View "My Extensions"
        return HttpResponseRedirect(reverse('my-extensions'))
        # Return to the newly created Extension Detail View
        # return redirect('extension-detail', pk=post.pk)
    # If this is a GET (or any other method) create the default form.
    # else:
    #     # Predefine the Extension.context Attribute with the current Username in GET
    #     form = MyExtensionCreateForm({'context': request.user})
    context = {
        'form': form,
    }

    # def get_form_kwargs(self):
    #     kwargs = super(MyExtensionCreate, self).get_form_kwargs()
    #     kwargs.update({'user': request.user})
    #     return kwargs

    return render(request, 'catalog/extension_form-by-user.html', context)

我创建了一个小视频来展示表单的当前行为。

表格视频:

我可以查看表单,并且选择会像我希望的那样受到限制。 但是提交表单只会重新加载页面,除此之外什么都不做。 所以它不会将值保存到数据库中,我也没有收到任何错误。

请问,有谁能帮帮我吗?

【问题讨论】:

  • 不,get_form_kwargs 根本不会做任何事情,因为您没有调用它。您似乎将基于类的视图与基于函数的视图混淆了。但是您似乎并不需要该功能,因为您已经将用户传递给表单。
  • 感谢您指出这一点。我更改了文本,所以我希望它现在是正确的。但这并没有真正改变代码,所以它没有将任何内容保存到数据库的问题仍然存在。

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


【解决方案1】:

您已将表单的 __init__ 方法的签名更改为将 context 作为第一个位置参数。这意味着 POST 数据没有被传递给表单。

我不知道你为什么这样做,因为你从不使用context。删除那个论点。

【讨论】:

  • 就是这样!非常感谢!
  • 如果它对您有帮助,请接受答案,以向未来的搜索者表明它解决了问题。
  • 是的,但是...我该怎么做?
  • 啊是的,现在应该检查为正确答案:)
猜你喜欢
  • 2017-07-26
  • 2022-01-20
  • 2010-09-22
  • 2018-02-25
  • 2022-11-12
  • 2013-09-05
  • 2011-10-16
相关资源
最近更新 更多