3

ビュー.py

@login_required
@user_passes_test(lambda u: u.is_superuser)
def date_format(request):
    save_msg = ''
    user = request.user
    try:
        settings = Settings.objects.get(user=user.id)
        settingsForm = SettingsForm(instance=settings)
    except:
        settings = None
        settingsForm = SettingsForm(initial={'date_format':0, 'time_format':0})
    if request.method == 'POST':
        settingsForm = SettingsForm(request.POST, instance=settings)
        if settingsForm.is_valid():
            settings = settingsForm.save(commit=False)
            settings.user = user
            settings.save()
            save_msg = 'Date format has been updated.'
    return render(request,'setting/date_format.html',
                           {
                            'about_menu': True,
                            'date_tab':True,
                            'SettingsForm':settingsForm,
                            'save_msg': save_msg,
                           })

models.py

class Settings(models.Model):  
    user = models.ForeignKey(User, null=True)
    date_format = models.BooleanField('Date format', default=False)
    time_format = models.BooleanField('Time format', default=False)
    is_contactlist_active = models.BooleanField('Contacts', default=True)

初期値には、デフォルトのフォーマットが示されています。しかし、その値をデータベースに保存すると、値は保存されますが、選択した形式 (フォーム インスタンス) は表示されません。

4

4 に答える 4

0

「現在の回答」は削除されているため、どのように見えるかわかりませんが、いくつか提案してみることができます。

...
user = request.user
try:
    settings_inst = Settings.objects.get(user=user.id)
    settings_init = None
    settingsForm = SettingsForm(instance=settings_inst)
except:
    settings_init = {'date_format':0, 'time_format':0}
    settings_inst = None
    settingsForm = SettingsForm(initial=settings_init)

if request.method == 'POST':

    ## if settings_inst is None, you should fallback using the initial settings dict ##
    if settings_inst:
        settingsForm = SettingsForm(request.POST, instance=settings_inst)
    else:
        settingsForm = SettingsForm(request.POST, initial=settings_init)

    if settingsForm.is_valid():
        ...

あなたの場合、それを使用すると、POST リクエストが発生したかどうかを確認settings = Noneする前に渡すデータが上書きされ、最初の口述initialが毎回失われます。{'date_format' ...}

注意: 設定の名前をsettings_instandに変更settings_initしたのは、説明を簡単にするためです (そして、何が起こっているかをあなたの視点から見ることができます)。もちろん、ニーズに最も合うようにコードを再配置します (別名: これがコード内の他のものを壊す可能性があるかどうかはわかりません)。

于 2013-07-16T11:39:21.620 に答える
0

MultipleObjectsReturnedまたはその他の例外が発生していると思われますSettings.objects.get(user=user.id)

ユーザーにあるようForeignKeyに、ユーザーには複数Settingsの可能性があります

ビューを次のように変更できます。

@login_required
@user_passes_test(lambda u: u.is_superuser)
def date_format(request):
    save_msg = ''
    user = request.user
    try:
        #to update latest settings for an user
        settings = Settings.objects.filter(user=user.id).latest('id')
        settingsForm = SettingsForm(instance=settings)
    except:
        settings = None
        settingsForm = SettingsForm(initial={'date_format':0, 'time_format':0})
    if request.method == 'POST':
    #your existing code
    ...

または、ユーザーごとに 1 つの設定のみを使用する場合は、OneToOne関係を次のように使用します。

class Settings(models.Model):  
    user = models.OneToOneField(User, null=True)
    ....

request.user.settingsその後、ビューで直接参照できます。ビューを次のように更新します

@login_required
@user_passes_test(lambda u: u.is_superuser)
def date_format(request):
    save_msg = ''
    user = request.user
    if request.user.settings:
        settingsForm = SettingsForm(instance=request.user.settings)
    else:
        settings = None
        settingsForm = SettingsForm(initial={'date_format':0, 'time_format':0})
    if request.method == 'POST':
    ...
于 2013-07-20T10:02:20.150 に答える