【问题标题】:AttributeError 'int' object has no attribute 'get'AttributeError 'int' 对象没有属性 'get'
【发布时间】:2021-02-24 15:41:16
【问题描述】:

我收到一条错误消息:

AttributeError at /series/

'int' 对象没有属性 'get'

我不知道为什么以及是什么导致了这个错误 我的模型.py
class Series(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE, default=None)
    SeriesName = models.CharField(max_length=70, default="")
    NoEpisodes = models.PositiveIntegerField(default=0)
    EpisodesWatched = models.PositiveIntegerField(null=True, blank=True, default=0)
    CoverImage = models.ImageField(null=True, blank=True)

    class Meta:
        verbose_name_plural = "Series"

我的意见.py:

def seriesview(request):
    form = SeriesForm(request.POST or None)
    if request.method == 'POST':
        form = SeriesForm(request.POST)
        if form.is_valid(): # error raised here
            print("Form is valid")
    return render(request, 'series.html', {'form': form})

我的forms.py:

class SeriesForm(forms.ModelForm):
    class Meta:
        model = Series
        fields = ('SeriesName', 'NoEpisodes', 'EpisodesWatched', 'CoverImage')
        labels = {
            "SeriesName": "Series Name:",
            "NoEpisodes": "Number of episodes:",
            "EpisodesWatched": "Episodes watched:",
            "CoverImage": "Add a cover image:",
        }

    def __init__(self, *args, **kwargs):
        super(SeriesForm, self).__init__(*args, **kwargs)
        for visible in self.visible_fields():
            if visible.field.widget.input_type == 'file':
                visible.field.widget.attrs['class'] = 'form-control-file'
                continue
            visible.field.widget.attrs['class'] = 'form-control'

    def clean(self):
        episodes = self.cleaned_data['NoEpisodes']
        episodeswatched = self.cleaned_data['EpisodesWatched']
        if episodeswatched > episodes or episodes < episodeswatched:
            raise forms.ValidationError('Error creating series, Episodes watched can\'t be greater than number of episodes')
        return episodeswatched

追溯:

Traceback (most recent call last):
  File "C:\Users\HP\AppData\Local\Programs\Python\Python38-32\lib\site-packages\django\core\handlers\exception.py", line 47, in inner
    response = get_response(request)
  File "C:\Users\HP\AppData\Local\Programs\Python\Python38-32\lib\site-packages\django\core\handlers\base.py", line 179, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "E:\JK\Dev\Project\AET\AnimeX\views.py", line 70, in seriesview
    if form.is_valid():
  File "C:\Users\HP\AppData\Local\Programs\Python\Python38-32\lib\site-packages\django\forms\forms.py", line 177, in is_valid
    return self.is_bound and not self.errors
  File "C:\Users\HP\AppData\Local\Programs\Python\Python38-32\lib\site-packages\django\forms\forms.py", line 172, in errors
    self.full_clean()
  File "C:\Users\HP\AppData\Local\Programs\Python\Python38-32\lib\site-packages\django\forms\forms.py", line 376, in full_clean
    self._post_clean()
  File "C:\Users\HP\AppData\Local\Programs\Python\Python38-32\lib\site-packages\django\forms\models.py", line 386, in _post_clean
    exclude = self._get_validation_exclusions()
  File "C:\Users\HP\AppData\Local\Programs\Python\Python38-32\lib\site-packages\django\forms\models.py", line 346, in _get_validation_exclusions
    field_value = self.cleaned_data.get(field)
AttributeError: 'int' object has no attribute 'get'

当我收到错误消息时,django 会突出显示一行:

if form.is_valid(): # this line is in views.py

如果您需要任何其他信息,请在下面评论

【问题讨论】:

  • 我认为如果您发布错误的回溯会很有用。此外,如果可用,请发布被调用的 get_method() 的代码。
  • @fountainhead 我已经发布了回溯但我没有任何 get_method() 当我提交表单时出现此错误

标签: python django


【解决方案1】:

遵循 djnango 手册:

到调用表单的 clean() 方法时,所有单独的字段清除方法都将运行(前两节),因此 self.cleaned_data 将填充迄今为止存活的任何数据。因此,您还需要记住,您要验证的字段可能无法通过最初的单个字段检查。

所以在你的例子中,你有 get 方法:

def clean(self):
    episodes = self.cleaned_data['NoEpisodes'] # here
    episodeswatched = self.cleaned_data['EpisodesWatched'] # and here 
    if episodeswatched > episodes or episodes < episodeswatched:
        raise forms.ValidationError('Error creating series, Episodes watched can\'t be greater than number of episodes')
    return episodeswatched

可能在 clean_NoEpisodes 或 clean_EpisodesWatched 之后,其中一个字段为空。 (他们没有通过字段验证)。

在手册中有对 super.clean() 的调用,所以我会尝试类似的方法:

 def clean(self):
    cleaned_data = super().clean()
    print(cleaned_data) # to see all fields in console
    episodes = cleaned_data.get('NoEpisodes')
    episodeswatched = cleaned_data.get('EpisodesWatched')
    # and then magic 

【讨论】:

  • 我删除了return episodeswatched,它成功了!print(cleaned_data) 正在正确打印所有具有值的字段 谢谢!你给了我一些见解。
猜你喜欢
  • 1970-01-01
  • 2014-09-08
  • 2018-05-09
  • 2020-11-27
  • 2018-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多