【问题标题】:Get .csv values without saving it获取 .csv 值而不保存它
【发布时间】:2021-12-28 18:59:59
【问题描述】:

现在我正在通过模型表单上传 .csv 文件,将其保存在模型中,然后将 .csv 中的所有值读取/保存到另一个模型。

在我将所有值都放入另一个模型后,就不需要 .csv,因此我一直在尝试找到一种方法来读取 .csv 并获取值而不将其保存到模型中。

以下是我的基本观点。

感谢任何提示。


def ncaab_csv(request):

    form = CsvUpload(request.POST or None, request.FILES or None)

    if request.method == "POST":
        if form.is_valid():
            form.save()
        
            # Get the submitted csv file
            games_file = Csv.objects.get(games_entered=False)

            with open(games_file.file_name.path, 'r') as f:
                reader = csv.reader(f)

                for i, row in enumerate(reader):
                    if i == 0:
                        pass
                    else:
                        try:
                            game = NCAABGame.objects.get(name__name=row[1],
                                                         updated=False,
                                                         date=today)

                            All NCAABGame fields here...
                            
                            game.save()

            return redirect(reverse('ncaab_games'))

        else:
            messages.error(request, "Failed to save file.")
    else:
        template = 'management/ncaab/ncaab_csv.html'

    context = {
        'form': form,
    }

    return render(request, template, context)

【问题讨论】:

  • “将其保存到模型中”是什么意思?你的意思是form.save() 行吗?在那之后你不要使用form。如果你只是删除那条线它不起作用吗?
  • 对不起。是的,我为 Csv 文件创建了一个模型,但现在我只想在之后删除它们。我一直在保存它们,然后使用“games_file = Csv.objects.get(games_entered=False)”进行检索。如果我不保存文件,它会起作用吗?
  • 我可以做 games_file = request.POST.get('file') 吗?
  • 哦,我明白了; CsvUpload 在您的模型中创建一个新对象,然后您可以在 Csv.objects 中使用它。我会考虑的。

标签: python django csv


【解决方案1】:

我找到了解决方案,为其他正在寻找方法的人发帖。

我创建了一个 form.Form 和 FormView,然后在我的 forms.py 中处理了 .csv。

forms.py

    import io
    import csv

    class CsvUpload(forms.Form):
        data_file = forms.FileField()

        def process_data(self):

            f = io.TextIOWrapper(self.cleaned_data['data_file'].file)
            reader = csv.DictReader(f)

            for row in reader:
                game = NCAABGame.objects.get(
                        name__name=row['name'], updated=False, date=today)
                game.field_goals = row['field_goals']
                game.fg_attempts = row['fg_attempts']

                More data saved to NCAABGame model...

                game.save()
views.py

    from django.views.generic.edit import FormView

    class CsvView(FormView):
        template_name = 'management/ncaab/ncaab_csv.html'
        form_class = CsvUpload
        success_url = '/management/ncaab_games/'

        def form_valid(self, form):
            form.process_data()
            messages.success(self.request, 'Successfully processed games!')
            return super().form_valid(form)
.html

    <form method="post">
    {% csrf_token %}
        {{ forms.form.as_p }}
        <input type="submit" value="submit"/>
    </form>

【讨论】:

    猜你喜欢
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    • 2011-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-23
    • 1970-01-01
    相关资源
    最近更新 更多