猿问

Django 使用模型形式更新模型实例

我在 Django 中有以下模型,用于存储有关药物的数据。


class Medicine(models.Model):

    Medicine_Name = models.CharField(max_length=100)

    User_Associated = models.ForeignKey(User, on_delete=models.CASCADE)

    Tablets_In_Box = models.IntegerField()

    Dose_in_mg = models.IntegerField()

    Dose_Tablets = models.IntegerField()

    Number_Of_Boxes = models.IntegerField()

    Last_Collected = models.DateField()


    def __str__(self):

        return self.Medicine_Name

    

    def get_absolute_url(self):

        return reverse('tracker-home')

我正在尝试创建一个模型表单,用户可以在其中更新他们的一种药物的最后一个集合。这是我开始的。


class CollectionForm(forms.ModelForm):

    class Meta:

        model = Medicine

        fields = ['Medicine_Name', 'Number_Of_Boxes', 'Last_Collected']

我不明白如何根据现场的“Medicine_Name”调用我的模型实例。换句话说,我需要用户能够从下拉菜单中选择正确的药物,然后表单必须更新我的药物模型上的“Last_Collected”和“Numer_Of_Boxes”字段。


https://docs.djangoproject.com/en/2.1/topics/forms/modelforms/#the-save-method


这似乎包含相关信息,但我很难了解如何在这种情况下使用它。如何根据表单中的用户输入正确获取我需要的药物表单实例?此外,如何在我的视图中使用 save 方法来确保数据库得到正确更新?


编辑为表单添加了视图:


def update(request, pk):

    

    instance = Medicine.objects.get(id=pk)

    if request.method == 'POST':

        form = CollectionForm(user=request.user, instance=instance, data=request.POST)

        

        if form.is_valid():

            instance = form.save(commit=False)

            instance.User_Associated = request.user

            instance.save()

    else:

        form = CollectionForm() 

    context = {'form': form}


    return render(request, 'tracker/medicine_collection.html', context )


三国纷争
浏览 110回答 2
2回答

哆啦的时光机

观点:def update(request, pk):    instance = Medicine.objects.get(id=pk)    if request.method == 'POST':        form = CollectionForm(instance=instance, data=request.POST)        if form.is_valid():            instance = form.save(commit=False)            instance.User_Associated = request.user            instance.save()        return redirect ('/')        ....

慕田峪7331174

尝试了一种不同的方法(基于类的视图 - UpdateView)我刚刚在 SO 上学到了这里。没有测试它,但我认为它是朝着正确方向迈出的一步。class UpdateMedicine(LoginRequiredMixin, UpdateView):    model = Medicine  #call the model you need to update    fields = ['Medicine_Name', 'Number_Of_Boxes', 'Last_Collected'] #specify the fields you need to update    template_name_suffix = 'medicine_update_form' #specify the template where the update form is living    def get_context_data(self, **kwargs):        context = super().get_context_data(**kwargs)        context.update(            user=self.request.user, #get the current logged in user            instance=get_object_or_404(Medicine, pk=self.kwargs['pk']) #get the pk of the instance        )        return context    def form_valid(self, form):        form.instance.medicine = get_object_or_404(Medicine, slug=self.kwargs['pk'])        return super().form_valid(form) #saves the updates to the instance     def get_success_url(self):        return reverse('medicine-collection') #name of the url where your 'tracker/medicine_collection.html is living将适当的模板和 url 链接到上面的示例并自己尝试一些事情。

HUWWW

这是基于更新特定用户的实例。本教程帮助我实现了同样的目标。https://youtu.be/EX6Tt-ZW0so
随时随地看视频慕课网APP

相关分类

Python
我要回答