Passing variable to a form for display in django

拟墨画扇 提交于 2019-12-13 05:04:58

问题


views.py

def when(request):
    user = request.user
    report = Report.objects.get(user=request.user)
    reportform = ReportForm(instance=report)

    settings = Settings.objects.get(user=request.user)
    settingsForm = SettingsForm(instance=settings) 
 #   settings=Settings.objects.get(user=2)
    if settings.date_format == '0':
        date = report.manual_date.strftime('%d/%m/%Y')
    else:
        date = report.manual_date.strftime('%m/%d/%Y')
    if settings.time_format == '0':
        time = report.manual_time.strftime('%I:%M%p')
    else:
        time = report.manual_time.strftime('%H:%M')
    if request.method == 'POST':            
        reportform = ReportForm(instance=report,data=request.POST,initial={'manual_date': date,'manual_time': time})
        if reportform.is_valid():
            report = reportform.save(commit=False) 
            report.user = request.user
            report.save()
            return redirect('/member/media/')

    return render_to_response('incident/when.html',{
                  'newreport_menu': True, 
                  'form': reportform,
                   'date':date,
                   'time':time,                  
                   },
                   context_instance=RequestContext(request))

forms.py

class ReportForm(forms.ModelForm):   
    class Meta:
        model = Report
        fields = ['incident_description','manual_date','manual_time', 'location_description',
                  'incident_followup', 'incident_followup_name_1', 'incident_followup_email_1', 
                  'incident_followup_name_2', 'incident_followup_email_2', 'phone_call_log', 
                  'notes_other','notes_firstaid','notes_risk']
    #    manual_date = forms.DateField(input_formats=['%d/%m/%Y', '%d-%m-%Y'],
     #                              widget=forms.DateInput(format="%-d/%-m/%Y"))
        widgets = {'manual_date': forms.DateInput(attrs={'size':'15','id':'datepicker',
            },format='%d/%m/%Y'),'manual_time': forms.TimeInput(attrs={'size':'8','class':'time_field', },format='%H:%M')
         }

How to pass the converted date and time format i.e,date and time variable to form.The format what i specified in form is displaying now,but depend on the condition on views,the time and date format should change in form field.

Thanks


回答1:


Try to create the form with this line:

reportform = ReportForm(instance=report,initial={'manual_date':date, 'manual_time':time})

where date variable is the date formatted. You will have to move down the instantiation of the form. This would be your code:

def when(request):
    user = request.user
    report = Report.objects.get(user=request.user)

    settings = Settings.objects.get(user=request.user)
    settingsForm = SettingsForm(instance=settings) 
 #   settings=Settings.objects.get(user=2)
    if settings.date_format == '0':
        date = report.manual_date.strftime('%d/%m/%Y')
    else:
        date = report.manual_date.strftime('%m/%d/%Y')
    if settings.time_format == '0':
        time = report.manual_time.strftime('%I:%M%p')
    else:
        time = report.manual_time.strftime('%H:%M')
    if request.method == 'POST':            
        reportform = ReportForm(instance=report,data=request.POST,initial={'manual_date': date,'manual_time': time})
        if reportform.is_valid():
            report = reportform.save(commit=False) 
            report.user = request.user
            report.save()
            return redirect('/member/media/')

    reportform = ReportForm(instance=report,initial={'manual_date':date, 'manual_time':time})
    return render_to_response('incident/when.html',{
                  'newreport_menu': True, 
                  'form': reportform,
                   'date':date,
                   'time':time,                  
                   },
                   context_instance=RequestContext(request))

That tries to set manually the initial value of the form already formatted when you instantiate it.

Hope it helps!




回答2:


You can use template tag/filter date. Define it on the view level and pass to the template:

if settings.date_format == '0':
    date_filter = 'd/m/Y'
else:
    date_filter = 'm/d/Y'
if settings.time_format == '0':
    time_filter = 'I:Mp'
else:
    time_filter = 'H:M'

In the template:

{{ form.manual_date|date:date_filter }}
{{ form.manual_time|date:time_filter }}

I'm not sure about the current format but you can always check the reference to get what you want.

PS. Perhaps the view is not the best place to put this code. It's much better to create separate function(s) to handle this.



来源:https://stackoverflow.com/questions/16461862/passing-variable-to-a-form-for-display-in-django

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!