如何查看提供的所有表单字段并更新模型

how to look over all form fields provided and updating the model

我创建了一个 Django 视图来做两件事:

  1. 创建一个新帐户
  2. 修改账户

作品: 创建新帐户并将 HTML 表单数据提交到数据库。也适用:如果用户想要使用数据库中已知的帐户数据修改帐户,则显示预填 HTML 表单。

无效: 当用户提交 his/her 表格来更新帐户时(用户修改了表格中的信息),数据库中没有任何更新。

我知道如何像这样更新数据库中的一个静态值:

        a = accounts.objects.filter(pk=account_id).update(name='static value here')

但我不知道如何使用用户在使用 Django Modelforms 时提交的所有表单数据来更新数据库。有谁知道如何用提交的表单数据更新数据库?

代码

    @login_required(login_url='/dashboard/')
def dashboard_accounts_new_modify(request, account_id=None):

    if request.method == 'POST':

        # POST DETECTED

        form = MyModelForm(request.POST, request.FILES)

        if account_id:

            # POST DETECTED
            # ACCOUNT ID FOUND
            # USER WANTS TO MODIFY A ACCOUNT

            # WITH THIS QUERY I CAN UPDATE 1 STATIC VALUE IN THE DATABASE
            # HOW DO I UPDATE THE VALUES FROM THE FORM IN THE DATABASE?? :(
            a = accounts.objects.filter(pk=account_id).update(name='static value here')

            return HttpResponseRedirect('/dashboard/accounts/')

        else:

            # POST DETECTED
            # ACCOUNT ID NOT FOUND
            # USER WANTS TO CREATE A NEW ACCOUNT

            if form.is_valid():

                if request.POST.get("name").lower() == 'new':
                    raise Http404("New account name may not be named NEW.")

                # DATAHASE QUERY: ADD NEW ACCOUNT TO DATABASE
                form.save()

                # REDIRECT
                return HttpResponseRedirect('/dashboard/accounts/')

    elif account_id:

        # NO POST DETECTED
        # ACCOUNT ID FOUND
        # PREFILL FORM WITH DATA 

        try:
            from django.forms.models import model_to_dict
            a = accounts.objects.get(pk=account_id)
            form = MyModelForm(initial=model_to_dict(a))
        except:
            raise Http404("Account not found.")
    else:
        # NO POST DETECTED
        # MODIFICATION IS NOT DETECTED
        # LOAD EMPTY FORM

        form = MyModelForm()

    return render(request, 'backend/base_accounts_new.html', {'Title': 'Accounts', 'form' : form})

型号

# Clientdatabase
class accounts(models.Model):
    name = models.CharField(max_length=200)
    url = models.CharField(max_length=200)
    website_title = models.CharField(max_length=200)    
    website_h1_text = models.CharField(max_length=200)
    website_h2_text = models.CharField(max_length=200)
    website_search_text = models.CharField(max_length=200)
    website_font = models.CharField(max_length=200) 
    website_footer_left = models.CharField(max_length=600)
    website_footer_right = models.CharField(max_length=600)
    website_color_code_search_button = models.CharField(max_length=200)
    website_color_code_banner = models.CharField(max_length=200)
    website_logo_height_pixels = models.PositiveIntegerField()
    website_logo_width_pixels = models.PositiveIntegerField()
    filepath_favicon = models.FileField()
    filepath_logo_vector = models.FileField()
    filepath_logo_normal = models.FileField()
    filepath_background_1 = models.FileField()
    filepath_background_2 = models.FileField(blank=True, null=True)
    filepath_background_3 = models.FileField(blank=True, null=True)
    filepath_background_4 = models.FileField(blank=True, null=True)
    setting_background_1_active = models.BooleanField()
    setting_background_2_active = models.BooleanField()
    setting_background_3_active = models.BooleanField()
    setting_background_4_active = models.BooleanField()

    def __str__(self):
        return self.name

class AccountsForm(ModelForm):
    class Meta:
        model = accounts
        fields = '__all__'

你可以这样做:

from django.shortcuts import get_object_or_404

if request.method == 'POST':
    if account_id::
        account = get_object_or_404(accounts, pk=account_id)
        form = MyModelForm(request.POST,request.FILES, instance=account)
        if form.is_valid():
            ...
            form.save()
            return HttpResponseRedirect('/dashboard/accounts/')
    else:
        form = MyModelForm(request.POST, request.FILES)
        if form.is_valid():
            if request.POST.get("name").lower() == 'new':
                raise Http404("New account name may not be named NEW.")
            form.save()

了解有关表单的更多信息here