我有 // login process
private void GetStudentDetail(final String mobile) {
// Tag used to cancel the request
String tag_string_req = "req_Verfication";
progressBarList.setVisibility(View.VISIBLE);
StringRequest strReq = new StringRequest(Request.Method.POST,
Config.FETCH_StudentsOfParent_URL, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
Log.d(TAG, "cerfication Response: " + response.toString());
JSONArray jsonArrayResult ;
for (int i = 0; i < response.length(); i++) {
try {
JSONObject jObj = new JSONObject(response);
boolean error = jObj.getBoolean("error");
// Check for error node in json
if (!error) {
jsonArrayResult = jObj.getJSONArray("user");
for(int x=0; x<jsonArrayResult.length();x++){
JSONObject json = jsonArrayResult.getJSONObject(x);
String id = json.getString("id");
String studentId = json.getString("sutdentId");
int ID1 =Integer.parseInt(studentId);
String full_name = json.getString("full_name");
String year = json.getString("year");
String school = json.getString("school");
String level = json.getString("level");
String driver_fullname = json.getString("driver_fullname");
String driverphone_number = json.getString("driverphone_number");
String plate_no = json.getString("plate_no");
// Decode base64_encode encoded image from mysql
byte[] photo = Base64.decode(json.getString("photo"), Base64.DEFAULT) ;
Bitmap bmp = BitmapFactory.decodeByteArray(photo, 0, photo.length);
image.setImageBitmap(Bitmap.createScaledBitmap(bmp, image.getWidth(),
image.getHeight(), false));
}
}
else{
String errorMsg = jObj.getString("error_msg");
Toast.makeText(getActivity(), errorMsg, Toast.LENGTH_LONG).show();
}
} catch (JSONException e) {
// JSON error
e.printStackTrace();
Toast.makeText(getActivity(), "Json error: " + e.getMessage(), Toast.LENGTH_LONG).show();
}
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.e(TAG, "Verfication error Error: " + error.getMessage());
}
}) {
@Override
protected Map<String, String> getParams() {
Map<String, String> params = new HashMap<String, String>();
params.put("mobile", mobile);
return params;
}
};
// Adding request to request queue
MyApplication.getInstance().addToRequestQueue(strReq,tag_string_req);
}
的模型,用于保存上传的文件(模型中没有FileField)。
JSONField
JSON示例
[ {&#34; id&#34;:&#34; file_id&#34;, &#34; url&#34;:&#34; file_url_at_S3&#34;, &#34;输入&#34;:&#34; MIME类型&#34; } ]
我想构建一个管理界面,以便用户可以填写class Task(models.Model):
....
attachments = fields.JSONField(null=True)
....
个详细信息并上传将上传到S3的文件,结果json将保存在数据库中。所以我决定使用自定义Task
类来处理它。
我的Form
是
AdminModel
@admin.register(Task)
class TaskAdmin(MarkdownxModelAdmin):
form = TaskForm
exclude = ('created_at', 'updated_at', 'attachments')
list_display = ('message', 'publish_at')
def save_model(self, request, obj, form, change):
upload_result = upload_files_to_s3(form.cleaned_data.get('attachments', []),
task_id=obj.id)
obj.attachments = upload_result
super(TaskAdmin, self).save_model(request, obj, form, change)
只是{mark}的MarkdownxModelAdmin
的子类。
我的自定义表单是
ModelAdmin
我喜欢来自docs的class TaskForm(forms.ModelForm):
attachments = MultiFileField() # redefine field from the model
....
def clean(self):
# validations...
class Meta:
model = Task
fields = '__all__'
内联样式。因此,用户可以通过小预览或上传的文件路径逐个添加文件。所以界面看起来像
这里最好的解决方案是什么?